javascript计算数组重复元素个数,并计算个数

javascript计算数组重复元素个数,并计算个数!
ex:

var list = [ {"id":1, "name": "AA"}, {"id":1, "name": "AA"}, {"id":1, "name": "AA"}, {"id":2, "name": "BB"}];
如何用javascript计算数组重复的{"id":1, "name": "AA"}个数并且变成
var list2 = [ {"id":1, "name": "AA","number":3}, {"id":2, "name": "BB","number":1}];

楼上的回答,如果只针对题主的需求,应该可以解决问题了。

但是,如果考虑的更全面些,我们应该考虑到JS数组中的数据类型可以是多样的(有可能是Object、Array、String...)

所以我写了一个比较复杂的,效率可能比较低,可以慢慢优化:

(function(){
   function isObject(o) {
       return Object.prototype.toString.call(o) === '[object Object]';
   }
   function isArray(o) {
       return Object.prototype.toString.call(o) === '[object Array]';
   }
   function duplicate(arr) {
       var tmp;
       if (!arr || arr.length === 0) {
           return [];
       }
       for (var i = 0, len = arr.length; i < len; i++) {
           tmp = arr[i];
           if (isArray(tmp)) {
               for (var j = i + 1; j < len; j++) {
                   if (isArray(arr[j]) && tmp.length === arr[j].length) {
                       var flag = false;
                       for (var k = 0; k < tmp.length; k++) {
                           if (tmp[k] !== arr[j][k]) {
                               flag = true;
                               break;
                           }
                       }
                       if (!flag) {
                           arr.splice(j, 1);
                           len--;
                           j--;
                       }
                   }
               }
           } else if (isObject(tmp)) {
               for (var j = i + 1; j < len; j++) {
                   if (isObject(arr[j])) {
                       var tmpKey = [], objKey = [], flag = false;
                       for (var k in tmp) {
                           tmpKey.push(k);
                       }
                       for (var l in arr[j]) {
                           objKey.push(l);
                       }
                       if (tmpKey.length === objKey.length) {
                           for (var key in tmp) {
                               if (tmp[key] !== arr[j][key]) {
                                   flag = true;
                                   break;
                               }
                           }
                       }
                       if (!flag) {
                           arr.splice(j, 1);
                           len--;
                           j--;
                       }
                   }
               }
           } else {
               for (var j = i + 1; j < len; j++) {
                   if (tmp === arr[j]) {
                       arr.splice(j, 1);
                       len--;
                       j--;
                   }
               }
           }
       }
       return arr;
   }

   var list = [{"id":1, "name": "AA"}, {"id":1, "name": "AA"}, {"id":1, "name": "AA"}, {"id":2, "name": "BB"}];
   var ls = [{"id":1, "name": "AA"}, {"id":1, "name": "AA"}, [12, 23], [12, 23], [12, 23, 34], {"xxx": "yyy", "id": 2}, "aa", "aa", "aabb"];
   var list2 = duplicate(list);
   var ls2 = duplicate(ls);
   
   console.log(list2);
   console.log(ls2);
})();

希望能解决题主的问题...

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-10-01
var list2 = [];
var listMap = {};
for (var i = 0, len = list.length, id, name, key; i < len; i++) {
    id = list[i].id;
    name = list[i].name;
    key = id + '-' + name; // key为id和name的组合,值为number
    if (!!listMap[key]) {
        listMap[key]++;
    } else {
        listMap[key] = 1;
    }
}
for (var item in listMap) {
    list2.push({
        id: item.split('-')[0],
        name: item.split('-')[1],
        number: listMap[item]
    })
}

本回答被提问者采纳
第2个回答  2017-10-27
var index={};//声明标识
var list = [ {"id":1, "name": "AA"}, {"id":1, "name": "AA"}, {"id":1, "name": "AA"}, {"id":2, "name": "BB"}];
var list2 = [];
for(var i =0;i<list.length;i++){
    var id =list[i].id;//取出id
    var token = id+'total'; //声明某的对象的出现次数
    if(index[id]==undefined){//如果没有该对象属性,说明第一次
        index[id]=id;
        index[token]=1;//默认出现次数为1次
        list2.push(list[i]);
    }else{//出现多次
        index[token]++;//数据
    }
   alert(JSON.stringify(index))
}