Суммируйте значения одного и того же идентификатора в массиве Json, используя JS - PullRequest
1 голос
/ 11 июня 2019

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

var arrayVal = [{id:"1", age: 20},{id:"2", age: 30},{id:"2", age: "20"},{id:"3", age: 20},{id:"5", age: 10}];

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

1 = 20
2 = 50
3 = 20
5 = 10

Пожалуйста, найдите ниже код

$scope.TestFunc = function()
{
var tot = 0;
var arrayVal = [{id:"1", age: 20},{id:"2", age: 30},{id:"2", age: "20"},{id:"3", age: 20},{id:"5", age: 10}];
for(var i=0; i <arrayVal.length; i++ )
{
  for(var j=1; j<arrayVal.length - i; j++ )
  {
    if(arrayVal[i].id == arrayVal[j].id)
    {
      tot = arrayVal[i].age.valueOf() + arrayVal[j].age.valueOf();
    }
    else{
      tot = tot + arrayVal[i].age;
    }
  }
}
console.log("-----total----"+tot);
}

Я не получаю ожидаемый результат. консоль отображает выходные данные как 202020. Что пошло не так в приведенном выше коде?

Ответы [ 3 ]

7 голосов
/ 11 июня 2019

С простой reduce() операцией:

const array = [{id:"1", age: 20},{id:"2", age: 30},{id:"2", age: "20"},{id:"3", age: 20},{id:"5", age: 10}];

const ages = array.reduce((a, {id, age}) => (a[id] = (a[id] || 0) + +age, a), {});

console.log(ages);

Помимо того, что решение reduce является более компактным и декларативным, основная проблема с предоставленным кодом связана с принуждением . Одно из значений age содержит строку "20", что заставляет последующие операции + интерпретироваться как конкатенация строк.

Этот ответ позволяет избежать этого неожиданного побочного эффекта, используя +age, заставляя age быть Number (это можно сделать явным, если вместо этого сделать Number(age)).

0 голосов
/ 11 июня 2019

Я подготовил еще один ответ, используя метод Array # lower , который возвращает массив объектов вместо простого массива:

const arrayVal = [{id:"1", age: 20},{id:"2", age: 30},{id:"2", age: "20"},{id:"3", age: 20},{id:"5", age: 10}];

let summedAges = arrayVal.reduce((a, c) => {
	let filtered = a.filter(el => el.id === c.id);
	if(filtered.length > 0){
		a[a.indexOf(filtered[0])].age += +c.age;
	}else{
		a.push(c);
	}
	return a;
}, []);

console.log(JSON.stringify(summedAges));
0 голосов
/ 11 июня 2019

Возраст должен быть числом.Это не должно быть как строка.В вашем коде id: 2 имеет 20 в качестве строки.Пожалуйста, проверьте тип данных в arrayVal.

var arrayVal = [{id: "1", age: 20}, {id: "2", age: 30}, {id: "2", age:20}, {id: "3", возраст: 20}, {id: "5", возраст: 10}];

$scope.TestFunc = function()
{
var tot = 0;
var arrayVal = [{id:"1", age: 20},{id:"2", age: 30},{id:"2", age: 20},{id:"3", age: 20},{id:"5", age: 10}];
for(var i=0; i <arrayVal.length; i++ )
{
  for(var j=1; j<arrayVal.length - i; j++ )
  {
    if(arrayVal[i].id == arrayVal[j].id)
    {
      tot = arrayVal[i].age.valueOf() + arrayVal[j].age.valueOf();
    }
    else{
      tot = tot + arrayVal[i].age;
    }
  }
}
console.log("-----total----"+tot);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...