减少对象数组

时间:2018-10-22 20:06:21

标签: javascript typescript reduce

我有一个对象数组。我将以下各项串联起来:

obj2 = [{ rowNumber:33, rows:[{item1:'ItemOne'}]}, { rowNumber:44, rows:[{item2:'ItemTwo'}]}]  
===> new obj = [{ rowNumber:77, rows:[{item1:'ItemOne'},{item2:'ItemTwo'}]}] 

这是我的代码

let newobj=obj2.reduce((current , next)=> {
     current.rowNumber+next.rowNumber;
     current.rows.push(next.rows);
     return next;
});
console.log(JSON.stringify(newobj))

实际上只有第二个元素是什么

{"rowNumber":44,"rows":[{"item2":"ItemTwo"}]}

PS:我正在使用打字稿

4 个答案:

答案 0 :(得分:4)

您没有更新current对象(实际上应称为accumulator)。另外,您要推送到current,但要返回next。这是固定版本。

let obj2 = [{ rowNumber:33, rows:[{item1:'ItemOne'}]}, { rowNumber:44, rows:[{item2:'ItemTwo'}]}];

let newobj = obj2.reduce((current , next) => {
     current.rowNumber += next.rowNumber;
     current.rows.push(...next.rows);
     return current;
});
console.log(JSON.stringify(newobj))

我将在reduce函数中将变量名称固定为(acc, current) => {...}只是为了遵守约定,这样很明显,您想使用current更新acc然后返回{ {1}}。

答案 1 :(得分:1)

如果您知道acc数组的结构,则可以采用以下解决方案,该解决方案将是最终的单个对象,其总和为obj2和行数组。 / p>

请看看:

rowNumbers

答案 2 :(得分:1)

我相信是因为您试图将最后一个元素 next 输入到第一个元素 current

如您所知,Reduce函数允许您采用数组并返回单个值。它使用最后一个值获得新值,一次对数组中的每个元素进行评估。

因此,您应该执行以下操作:

let obj2 = [{ rowNumber:33, rows:[{item1:'ItemOne'}]}, { rowNumber:44,   rows:[{item2:'ItemTwo'}]}];

let newobj=obj2.reduce((current , next)=> {
 next.rowNumber += current.rowNumber;
 next.rows.push(current.rows);
 return next;
});

console.log(newobj)

答案 3 :(得分:0)

尝试使用Javascript Array.concat()方法代替push()

您可以在这里查看:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat