Итерация по групповому массиву json - PullRequest
1 голос
/ 26 апреля 2019

У меня есть массив объектов JSON следующим образом

 var array = [{"id":"1","value": "13"},{"id":"2","value": "23"},{"id":"1","value": "33"},{"id":"3","value": "13"}]

Затем я сгруппировал массив json в соответствии с идентификатором следующим образом

var groupArray = {"1":[{"id":"1","value": "13"},{"id":"1","value": "33"}],
                     "2": [{"id":"2","value": "23"}],
                     "3": [{"id":"3","value": "13"}]};

Я хочу перебрать groupArray и получить сумму значений для каждого идентификатора, где повторяющиеся идентификаторы должны суммироваться вместе, давать одно общее значение и назначать их в другой массив следующим образом

resultArray
[{"id":"1","value":"46"},{"id":"2","value":"23"},{"id":"3","value":"13"}]

Это должно быть достигнуто с помощью angularjs

Ответы [ 4 ]

0 голосов
/ 26 апреля 2019

Вы можете использовать функцию reduce для группировки и функцию Object.values для извлечения желаемого результата.

var array = [{"id":"1","value": "13"},{"id":"2","value": "23"},{"id":"1","value": "33"},{"id":"3","value": "13"}]
let result = Object.values(array.reduce((a, {id, value}) => {
  (a[id] || (a[id] = {id, value: 0})).value += +value;
  return a;
}, Object.create(null)));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 26 апреля 2019

Было бы проще, если бы groupArray был фактически массивом. Как объект, вы должны знать, что порядок не всегда гарантирован, но неясно, важен ли порядок вашего окончательного массива. В недавнем JS это не должно иметь значения - числовые ключи будут отсортированы. Вы можете просто вызвать map() для Object.values(), а затем использовать reduce() для каждого массива:

var groupArray = {
    "1":[{"id":"1","value": "13"},{"id":"1","value": "33"}],
    "2": [{"id":"2","value": "23"}],
    "3": [{"id":"3","value": "13"}]
}

let sums = Object.values(groupArray)
           .map(arr => arr.reduce((sums,{id, value}) => ({id, value: sums.value + +value}), {value:0}))
console.log(sums)

Вы должны знать, что value является строкой, и убедитесь, что вы добавляете числа, не объединяющие строки, когда используете +.

0 голосов
/ 26 апреля 2019

Используйте Object.entries, чтобы получить ключи объекта и значения в виде массива, затем переберите значения, чтобы суммировать value внутри каждого объекта, а затем сдвиньте его с id до resultArray.

let groupArray = {"1":[{"id":"1","value": "13"},{"id":"1","value": "33"}],"2": [{"id":"2","value": "23"}],"3": [{"id":"3","value": "13"}]}
let resultArray = []
Object.entries(groupArray).forEach(g => {
  let sumValue = 0
  g[1].forEach(o => sumValue += parseFloat(o.value))
  resultArray.push({
    "id": g[0],
    "value": sumValue.toString()
  })
})
console.log(resultArray)
0 голосов
/ 26 апреля 2019

Это будет работать

const object = {}
const array = [{"id":"1","value": "13"},{"id":"2","value": "23"},{"id":"1","value": "33"},{"id":"3","value": "13"}]

array.forEach(data => {
  object[data.id] = parseInt(data.value, 10) + (object[data.id] || 0)
})

const result = Object.entries(object).map(data => {
  return {
    'id': data[0],
    'value': data[1]
  }
})

console.log(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...