当涉及键值对时,您可以使用Javascript Array Map或Reduce吗?

时间:2018-05-03 19:06:42

标签: javascript arrays object

使用这样的数组并使用每个数字创建一个新数组,可以像这样完成前面数字的总和:

let numbers = [1, 2, 3, 4]
let total = 0
numbers.map(v => total += v)

// result 
// [1, 3, 6, 10]

如果数组包含具有键/值对的对象,或者我是否必须使用不同的方法,是否有办法使用相同的方法?

var numbers = [{ val1: 1, val2: 2, val3: 3, val4: 4 }]

结果将是与值相加的相同键。

var numbers = [{ val1: 1, val2: 3, val3: 6, val4: 10 }]

编辑:所有这些回答都在小提琴中起作用,但唯一一个在我的代码中工作的是

numbers.map(o => Object.assign(...Object.entries(o).map((s => ([k, v]) => ({ [k]: s += v}))(0))));

4 个答案:

答案 0 :(得分:3)

使用Array.map()迭代数组。使用Object.entries()从对象中获取键/值对,使用Array.reduce()迭代对,并使用total作为值重建对象。

注意:迭代顺序可能会根据traversal order of object properties in ES6更改。

const numbers = [{ val1: 1, val2: 2, val3: 3, val4: 4 }]
let total = 0
const result = numbers.map(n => Object.entries(n)
  .reduce((r, [k, v]) => {
    total += v;
    r[k] = total;
    return r;
  }, {}));
  
console.log(result);

答案 1 :(得分:1)

也许你可以试试这个:



var total = 0;
            
var array =[{ val1: 1, val2: 2, val3: 3, val4: 4 }]
array.map(element => Object.keys(element).map(k => { 
   total += element[k]; 
   element[k] = total; 
}));
           
console.log(array);




它将遍历数组并对所有对象属性进行sumarize。

答案 2 :(得分:1)

迭代对象的标准方法是使用Object.keys数组 构建累积对象的方法是Array.reduce

var numbers = [{ val1: 1, val2: 2, val3: 3, val4: 4 }];
var total = 0;
var mapped = Object.keys(numbers[0]).reduce((acc, key) => (acc[key] = total+=numbers[0][key], acc), {});

console.log(mapped);

答案 3 :(得分:1)

您可以映射单个对象,并通过在总和上使用闭包来分配键/值对。

var numbers = [{ val1: 1, val2: 2, val3: 3, val4: 4 }],
    result = numbers.map(o =>
        Object.assign(...Object.entries(o).map((s => ([k, v]) => ({ [k]: s += v}))(0))));

console.log(result);