如何以函数式编程风格修改数组?

时间:2019-03-08 13:56:14

标签: javascript functional-programming

如何使用forEach,map,reduce,filter等以功能性编程风格更改每个对象的arr ['first']。

let value = 'abc'
let arr = [{
 'first': 'aaa' 
},{
 'first': 'bbb' 
},{
 'first': 'ccc' 
}];

4 个答案:

答案 0 :(得分:0)

这是一种不变的方式,用于更新数组中每个项目的属性first。它使用Array.map()创建一个新数组,并使用散布运算符复制每个项目并将first属性设置为value

const value = 'abc';

const arr = [{ 'first': 'aaa' },{ 'first': 'bbb' },{ 'first': 'ccc' }];

const newArr = arr.map(item => ({ ...item, first: value }));

console.log(newArr);

如果要变异原始数组(对于函数范式而言,这不是一个好主意),请改用Array.forEach()

const value = 'abc';

const arr = [{ 'first': 'aaa' },{ 'first': 'bbb' },{ 'first': 'ccc' }];

arr.forEach(item => item.first = value);

console.log(arr);

答案 1 :(得分:0)

您可以使用map并创建一个新数组

let value = 'abc';
let arr = [{
  'first': 'aaa'
}, {
  'first': 'bbb'
}, {
  'first': 'ccc'
}];

let newArr = arr.map(function(item) {

  return {
    first: value
  }

})

console.log(newArr)

答案 2 :(得分:0)

如果我能很好地理解您,您想使用map在数组的每个对象中更改键名“ first”吗?

您可以尝试以下代码:

const value = 'abc';
const arr = [{
 'first': 'aaa' 
},{
 'first': 'bbb' 
},{
 'first': 'ccc' 
}];

const newArr = arr.map(obj => {
  if ('first' !== value) {
    Object.defineProperty(obj, value,
        Object.getOwnPropertyDescriptor(obj, 'first'));
    delete obj['first'];
  }
  return obj;
});

console.log(newArr);

或者如果您只想更改每个obj中first的值:

const value = 'abc';
const arr = [{
 'first': 'aaa' 
},{
 'first': 'bbb' 
},{
 'first': 'ccc' 
}];

const newArr = arr.map(obj => ({...obj, first: value}));
console.log(newArr);

答案 3 :(得分:-2)

您可以使用forEach和map进行映射,但是reduce和filter并非针对此类功能而设计。您可以详细了解here。我已经使用了ES6箭头功能。如果您不熟悉它们,但看起来却很奇怪,请阅读here

编辑

如果您只想编辑 arr 的每个项目。

arr.forEach(item => {
    item.first = value;
}

如@VLAZ所建议-如果您想以全功能方式进行操作,则应创建新数组。

let newArr = arr.map(item => {
    item.first = value;
    return item;
}