检查angularjs中的多维数组对象中是否已存在键值

时间:2016-12-07 17:00:10

标签: javascript angularjs

假设我有一个像这样的对象的数组

array = [
           {id:2,cnt:2},{id:3,cnt:3},{id:4,cnt:2},
           {id:1,cnt:6},{id:2,cnt:7},{id:5,cnt:4},
           {id:2,cnt:4},{id:3,cnt:2},{id:4,cnt:2},
           {id:3,cnt:2},{id:4,cnt:3},{id:5,cnt:2}
       ];

我需要创建另一个数组,其中包含我需要使用cnt添加id值的对象。

输出假设是这样的。

output = [
           {id:1,cnt:6},{id:2,cnt:13},{id:3,cnt:7},{id:4,cnt:7},{id:5,cnt:6}
         ];

我到目前为止所尝试的是

var general = [];
  angular.forEach(array, function(value){
    angular.forEach(value, function(val,key){
      angular.forEach(general, function(val1,key1){
         if(val1.id === val.id){
             val1.cnt +=val.cnt
            //@TOD0 how to add value of count and put it on general
         }else{
            //@TODO
            general.push(val);            
         }
      });                 

    });
  });

console.log(general);

我无法实现输出。我标记为TODO,我很困惑。有人能帮我吗?提前谢谢。

3 个答案:

答案 0 :(得分:2)

Array.reduce可以帮到你很多 - 你基本上创建一个新数组,并迭代你当前的数组并检查新数组以查看当前项是否存在。如果是,请添加cnt - 否则添加整个项目:

var mashed = arr.reduce(function(m, cur, idx) {
    var found = false;
    for (var i =0; i < m.length; i++) {
        if (m[i].id == cur.id) {
            m[i].cnt += cur.cnt;
            found = true;
        }
    }

    if (!found) {
        m.push(cur)
    }

    return m;
}, [])

小提琴演示:https://jsfiddle.net/1ffqv9g0/

答案 1 :(得分:0)

var arr  = [ 
{id:2,count:2,color:"red"},{id:3,count:3,color:"black"},{id:4,count:2,color:"white"}, 
{id:1,count:6,color:"green"},{id:2,count:7,color:"red"},{id:5,count:4,color:"blue"}, 
{id:2,count:4,color:"red"},{id:3,count:2,color:"black"},{id:4,count:2,color:"white"}, 
{id:3,count:2,color:"black"},{id:4,count:3,color:"red"},{id:5,count:2,color:"blue"} 
];
var obj={};
arr.forEach(function(a){
obj[a.id]=obj[a.id]||[0];
obj[a.id][0]=obj[a.id][0]+a["count"];
obj[a.id][1]=a.color;
})
//console.log(obj);
var brr=Object.keys(obj).map(function(a){
return {"id":a,"count":obj[a][0],"color":obj[a][1]};
})

console.log(brr);

答案 2 :(得分:0)

您可以使用哈希表作为结果。对于有序结果,您可以对结果进行排序。

var array = [{ id: 2, cnt: 2 }, { id: 3, cnt: 3 }, { id: 4, cnt: 2 }, { id: 1, cnt: 6 }, { id: 2, cnt: 7 }, { id: 5, cnt: 4 }, { id: 2, cnt: 4 }, { id: 3, cnt: 2 }, { id: 4, cnt: 2 }, { id: 3, cnt: 2 }, { id: 4, cnt: 3 }, { id: 5, cnt: 2 }],
    grouped = [];

array.forEach(function (a) {
    if (!this[a.id]) {
        this[a.id] = { id: a.id, cnt: 0 };
        grouped.push(this[a.id]);
    }
    this[a.id].cnt += a.cnt;
}, Object.create(null));


grouped.sort(function (a, b) { return a.id - b.id; });
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }