通过函数式编程更新JSON对象

时间:2017-01-21 08:14:21

标签: javascript functional-programming

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;
}

如果没有临时数组(函数式编程),我们怎么能这样做。

2 个答案:

答案 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}) =>语法)在参数列表中提取我们感兴趣的属性。