Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检查angularjs中的多维数组对象中是否已存在键值_Javascript_Angularjs - Fatal编程技术网

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

Javascript 检查angularjs中的多维数组对象中是否已存在键值,javascript,angularjs,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} ]; 其中,我需要使用对

假设我有一个数组,其中的对象如下

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}
       ];
其中,我需要使用对象创建另一个数组,在该数组中,我需要使用
id
添加
cnt

输出应该是这样的

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。有人能帮我吗?提前感谢。

数组。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;
}, [])
var mashed=arr.reduce(函数(m、cur、idx){
var=false;
对于(变量i=0;i
小提琴演示:

var arr=[
{id:2,计数:2,颜色:“红色”},{id:3,计数:3,颜色:“黑色”},{id:4,计数:2,颜色:“白色”},
{id:1,计数:6,颜色:“绿色”},{id:2,计数:7,颜色:“红色”},{id:5,计数:4,颜色:“蓝色”},
{id:2,计数:4,颜色:“红色”},{id:3,计数:2,颜色:“黑色”},{id:4,计数:2,颜色:“白色”},
{id:3,计数:2,颜色:“黑色”},{id:4,计数:3,颜色:“红色”},{id:5,计数:2,颜色:“蓝色”}
];
var obj={};
arr.forEach(功能(a){
obj[a.id]=obj[a.id]| |[0];
obj[a.id][0]=obj[a.id][0]+a[“count”];
obj[a.id][1]=a.color;
})
//控制台日志(obj);
var brr=Object.keys(obj.map)(函数(a){
返回{“id”:a,“count”:obj[a][0],“color”:obj[a][1]};
})

控制台日志(brr)您可以对结果使用哈希表。对于有序结果,可以对结果进行排序

var数组=[{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,cnt:5},cnt},
分组=[];
array.forEach(函数(a){
如果(!此[a.id]){
这个[a.id]={id:a.id,cnt:0};
分组。推送(此[a.id]);
}
此[a.id].cnt+=a.cnt;
},Object.create(null));
sort(函数(a,b){返回a.id-b.id;});
控制台日志(分组)

.as控制台包装{max height:100%!important;top:0;}
数组的语法无效
变量所需输出无效。我为我的错误道歉。Thanks@Mahi-那是因为OP的数学是错的。如果你把id
2
的所有
cnt
加起来-它会加到13是的,我知道…)如果(!this[a.id])不起作用,我建议您在
found=true
后使用
break
按页面重新加载?我的页面在一定时间间隔后使用ajax刷新。可能原始上下文丢失。我的页面每30秒使用ajax重新加载一次。当我的页面第一次被加载时就可以了。我试着控制它。我看到的是,我无法进入if(!this[a.id]){this[a.id]={id:a.id,cnt:0};grouped.push(this[a.id]);}代码的一部分。从远离控制台的地方,我真的帮不了你,对不起。如果我在上面的代码中有更多的键值对,如何添加?输入并查看obj[a.id]=obj[a.id]+a[“cnt”]+a['newval'];? 请给我一点提示。我是后端程序员,对javascript没有很好的理解。没有相同的代码。只需更改输入(arr)并查看我在arr中再添加一个键值对。在数组中获取此颜色键需要什么?请帮助我。我在这方面花费了很多时间,而且我不是javascript程序员。