var objList = [
{name: 'John', salary: 2000000}, {name: 'Adam', salary: 190000},
{name: 'Sally', salary: 300000}
]
使用工资>过滤对象195000并返回仅具有名称且没有薪水的对象。 (使用函数式编程)
方法:
function filter(objList){
var temp = [];
objList.filter(function(value, index){
return value.salary > 195000;
}).forEach(function(value, index){
temp.push(name: value.name);
});
return temp;
}
如果没有临时数组(函数式编程),我们怎么能这样做。
答案 0 :(得分:2)
这取决于函数式编程的含义。
您是希望避免突变,或消除副作用,还是使用接受更高阶函数的方法?
您当然可以使用.map
来删除对临时数组的需求。
objList
.filter(person => person.salary > 195000)
.map(person => person.name)
或者您可以编写自己的递归解决方案。
function getHighEarners([head, ...tail]) {
if (!head) return [];
if (head.salary > 195000) return [head.name, ...getHighEarners(tail)];
return getHighEarners(tail);
}
这种方法也适用于明确的咖喱解决方案。
function getEarnersByThreshold(salary) {
return function getHighEarners([head, ...tail]) {
if (!head) return [];
if (head.salary > salary) return [head.name, ...getHighEarners(tail)];
return getHighEarners(tail);
}
}
同样,您可以使用.reduce
,但我认为这样做的目的不太明确。
objList.reduce(
(names, person) => (person.salary > 195000)
? [...names, person.name]
: names,
[]
);
答案 1 :(得分:1)
objList
.filter(({salary}) => salary > 195000)
.map (({name}) => ({name}))
使用filter
仅提取salary
大于1950的对象。然后在结果上使用map
将包含salary
的对象数组映射到仅包含name
。
我们使用“参数解构”(({salary}) =>
和({name}) =>
语法)在参数列表中提取我们感兴趣的属性。