我试图使用.filter和.map通过一个键属性返回一个数字数组。
public getDefaultValues(key: string): number[]{
let options = [
{
key: 'cl',
values: [
5000,
10000,
15000,
30000,
50000
]
}]
return options
.filter(function(obj) {
return obj.key == key;
})
.map(function(obj){
return obj.values;
});
}但我知道错误是:
输入'number‘不能指定键入'number[]’。输入'number[]‘不能指定输入'number’。
我怎么才能解决这个问题?
发布于 2018-04-02 20:24:00
Filter将返回一个匹配数组,因此在本例中,您将得到一个数组,其中包含一个项。然后,您将获取该数组结果,并使用它上的映射来返回数组结果,这就是为什么要返回数组数组的原因,因此出现了错误。
您应该使用find,也许还应该使用下面这样的小错误检查:
return (options
.find(function(obj) {
return obj.key == key;
}) || { values: [] }).values下面是一个演示:
console.log(([{key:5, values: [1]}].find(function(obj) {
return obj.key == 5;
}) || { values: [] }).values);
console.log(([{key:6, values: [1]}].find(function(obj) {
return obj.key == 5;
}) || { values: [] }).values);
发布于 2018-04-02 20:28:40
您的返回值是一个2D数组,但是您正在声明您的方法的返回值是一个平面数字数组。您的.filter和.map方法是在“外部”数组( options的值)上调用的。
在.filter调用之后,返回值与options的值相同;您已经遍历了options并返回了每个具有键值的对象。
在您的.map调用之后,返回值是一个数组,它包含该数组中每个对象上每个values支柱的“所有”值。
返回语句的简单修复:
return options
.filter(function(obj) {
return obj.key == key;
})
.reduce(function(accum, obj){
return [...accum, ...obj.values || []];
}, []);它应该给出以下返回值:
[5000, 10000, 15000, 30000, 50000]
这是假设如果options中有多个具有相同键的对象,则需要连接数组.
https://stackoverflow.com/questions/49618202
复制相似问题