Array.map() 的函数式编程

Functional programming for Array.map()

我最近一直在阅读有关 Functional Programming and Immutable Objects in Javascript. What is the functional programming way of using map 方法的内容?

假设我想将数组中的值加倍。我能做到:

var arr1 = [{a: 1}, {a: 2}, {a: 3}];
arr1.map(function(el){
    el.a = el.a*2;
    return el;
});

// arr1 => [{a: 2}, {a: 4}, {a: 6}]

但这似乎违反了函数式编程和不变性的规则,回调将直接修改数组的元素。以下是 'correct' 的方法吗?

var arr1 = [{a: 1}, {a: 2}, {a: 3}];
var arr2 = angular.copy(arr1);

var arr2 = angular.copy(arr1).map(function(el){
  el.a = el.a*2;
  return el;
});

arr1 = arr2;

// arr1 => [{a: 2}, {a: 4}, {a: 6}]

还是我想多了? Fiddle 是 here.

您可以使用 pure function,它不会通过简单的 return 某些东西而不是将某些东西分配给数据元素来改变输入对象。

var arr1 = [{a: 1}, {a: 2}, {a: 3}],
    arr2 = arr1.map(function (el) {
        return  el.a * 2;
    });

console.log(arr2);
console.log(arr1);

Return 一个包含新对象的数组

var arr1 = [{a: 1}, {a: 2}, {a: 3}],
    arr2 = arr1.map(function (el) {
        return  { a: el.a * 2 };
    });

console.log(arr2);
console.log(arr1);

您将需要使用不改变其参数的纯函数。因此,如果您想要具有双倍值的对象,则必须创建新对象:

 var arr1 = [{a: 1}, {a: 2}, {a: 3}];
 console.log(arr1);
 var arr2 = arr1.map(function(el) {
    return {a: el.a*2};
 });
 console.log(arr2);

解构赋值会使这变得非常好。无论哪种方式,您都必须创建一个新对象,否则 arr1 中的对象将被修改。

let arr1 = [{a: 1}, {a: 2}, {a: 3}];
let arr2 = arr1.map(({a}) => ({a: a * 2}))

console.log(arr1); // [{a: 1}, {a: 2}, {a: 3}]
console.log(arr2); // [{a: 2}, {a: 4}, {a: 6}]