уменьшить массив объектов - PullRequest
0 голосов
/ 22 октября 2018

У меня есть массив объектов.Я бы конкатенировал пункты следующим образом:

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: яиспользуя Typescript

Ответы [ 4 ]

0 голосов
/ 22 октября 2018

Я полагаю, это потому, что вы пытаетесь ввести последний элемент, следующий , в первый элемент, текущий .

Как вы знаете, уменьшить функциипозволяют взять массив и возвращает одно значение.Он оценивает каждый элемент массива по одному, используя последнее значение , чтобы получить новое значение .

Так что вы должны сделать что-то вроде этого:

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)
0 голосов
/ 22 октября 2018

Вы не обновляете объект 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))

Я бы исправил имена переменных в функции приведения к (acc, current) => {...} только для того, чтобы придерживаться соглашения и чтобы было ясно, что вы хотите использовать current для обновления acc и затем вернуть acc.

0 голосов
/ 22 октября 2018

Если вам известна структура вашего массива obj2, вы можете воспользоваться приведенным ниже решением, которое будет состоять из одного объекта в финале с суммой rowNumbers и массивом строк.

посмотрите, пожалуйста:

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

let singleObj = {
  rowNumber: 0,
  rows: [],
}
for (let obj of obj2){
  singleObj.rowNumber += obj.rowNumber;
  if (obj.hasOwnProperty('rows')){
    for (var row of obj.rows){
      singleObj.rows.push(row)
    }
  }
}
//HERE YOU CAN STRINGIFY() IT
console.log(singleObj)
0 голосов
/ 22 октября 2018

Попробуйте использовать метод Javascript Array.concat () вместо push ()

Вы можете проверить это здесь:

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

...