我正在尝试使用.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'类型。
我该如何解决这个问题?
答案 0 :(得分:4)
Filter将返回一个匹配数组,因此在此示例中,您将获得一个包含一个项目的数组。然后你正在获取该数组结果并使用map来返回数组结果,这就是为什么你返回一个数组数组因此错误。
您应该使用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);

答案 1 :(得分:0)
您的返回值是2D数组,但您要声明方法的返回值是一个平坦的数字数组。您的.filter和.map方法正在"外部"数组,options
的值。
在.filter调用之后,返回值与options
的值相同;您已遍历options
并返回了具有键值的每个对象。
在.map调用之后,返回值是一个包含" all"的数组。该数组中每个对象的每个values
道具的值。
返回声明的简单修复:
return options
.filter(function(obj) {
return obj.key == key;
})
.reduce(function(accum, obj){
return [...accum, ...obj.values || []];
}, []);
这应该给你返回值:
[5000, 10000, 15000, 30000, 50000]
假设如果options
中有多个具有相同键的对象,您可能希望连接数组...