使用JS的Json数组中相同ID的总和

时间:2019-06-11 03:24:06

标签: javascript arrays

我有一个ID和年龄如下的json数组

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

我想获得属于同一id的年龄总和

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 个答案:

答案 0 :(得分:7)

通过简单的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)来明确表示)。< / p>

答案 1 :(得分:0)

年龄必须是数字。它不应该作为字符串。在您的代码中,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);
}

答案 2 :(得分:0)

我使用Array#reduce方法准备了另一个答案,该方法返回对象数组而不是简单数组:

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));