js数组对象去重问题

给的数据格式如下:

var students = [{
            groupid: '123',
            groupname:'aaa',
            classnick: '小红'
        },
        {
            groupid: '45',
            groupname:'bbb',
            classnick: '小黑'
        },
        {
            groupid: '',
            groupname:'',
            classnick: '张三'
        },
        {
            groupid: '233',
            groupname:'ccc',
            classnick: '李四'
        },
        {
            groupid: '45',
            groupname:'bbb',
            classnick: '王五'
        }];

要转变成如下的格式:

[{
            g_id: '123',
            g_name:'aaa',
            g_count:1
        },
        {
            g_id: '45',
            g_name:'bbb',
            g_count:2
        },
        {
            g_id: '233',
            g_name:'ccc',
            g_count:1
        }]

怎么实现呢?憋了好长时间了...应该循环几次?

阅读 4.2k
7 个回答
function filter(students) {
    var obj = {};
    var result = [];
    for (var i = 0, len = students.length; i < len; i++) {
        var item = students[i];
        var groupid = item.groupid;
        var groupname = item.groupname;
        var id = groupid + groupname;
        if (!id) continue;

        var index = obj[id];
        var current;
        if (index) {
            result[index].g_count++;
        } else {
            result.push({
                g_id: groupid,
                g_name: groupname,
                g_count: 1
            });
            obj[id] = result.length - 1;
        }
    }
    return result;
}
filter(students);
var arr = (function(){
  var obj ={} ,num = 0;
  return  students.map(
  x => {
            return obj[x.groupid] ? (obj[x.groupid]++,false) : (x.groupid ? ( obj[x.groupid ] = 1,{g_id : x.groupid , g_name : x.groupname}) : false)
         }
  ).filter(x => (x.g_count = obj[x.g_id],x))
})()
let keys={};
let array=[];
students.filter(ele=>{
    //统计grounpid的数量及过滤掉groupid为空的数据
    if(keys[ele.groupid]){
        keys[ele.groupid]++;
       }else{
         keys[ele.groupid]=1;
     }
     return ele.groupid;
 }).forEach((ele,index)=>{
   //遍历,把正确的数据填进新数组,由于g_count已统计,只需判断即可填充。

   //判断新数组里有没有含有groupid的数组,有就更新g_name,没有就填进数组
    let newIndex=array.findIndex(e=>e.g_id == ele.groupid);
    if(newIndex>-1){
       array[newIndex].g_name=ele.groupname;
     }else{
        let obj={
            g_id:ele.groupid,
            g_name:ele.groupname,
            g_count:keys[ele.groupid]
          }
        array.push(obj);
     }
       
   });

你这个需要改动key,但是本质上单层循环应该就可以实现,count可以用累加实现直接+1就可以了,不过这个的前提在于你的name重复的是一致的。

用lodash链接描述
先分组,我是用id作为分组的


    var students = [{
        groupid: '123',
        groupname:'aaa',
        classnick: '小红'
    },
        {
            groupid: '45',
            groupname:'bbb',
            classnick: '小黑'
        },
        {
            groupid: '',
            groupname:'',
            classnick: '张三'
        },
        {
            groupid: '233',
            groupname:'ccc',
            classnick: '李四'
        },
        {
            groupid: '45',
            groupname:'bbb',
            classnick: '王五'
        }];

     var grouped = _.groupBy(students,'groupid');
     var keys = _.keys(grouped);
     var result = keys.map( v=>({
        g_count:grouped[v].length,
        g_id:v,
        g_name:grouped[v][0].groupname,
        classnick:grouped[v][0].classnick,
    }));
"data": [
        {
            "g_count": 2,
            "g_id": "45",
            "g_name": "bbb",
            "classnick": "小黑"
        },
        {
            "g_count": 1,
            "g_id": "123",
            "g_name": "aaa",
            "classnick": "小红"
        },
        {
            "g_count": 1,
            "g_id": "233",
            "g_name": "ccc",
            "classnick": "李四"
        },
        {
            "g_count": 1,
            "g_id": "",
            "g_name": "",
            "classnick": "张三"
        }
    ],

题主的需求是 以 groupid和groupname的联合作为key来进行数目统计。

let o = {};
let arr =[];
students.forEach(s => {
    let id = s.groupid+s.groupname;
    if(o[id]){
         o[id].g_count ++;
    }else{
        o[id] = {
            g_id: s.groupid,
            g_name: s.groupname,
            g_count: 0
        };
    }
})
for (key in o){
    if (o.hasOwnProperty(key) === true){
        arr.push(o[key])
    }
}
console.log(arr)

一次就行吧,仅供参考。

let o = [];
students.forEach(s => {
    let id = parseInt(s.groupid);
    if(o[id])
        o[id] = {
            g_id: s.groupid,
            g_name: s.groupname,
            g_count: 0
        };
    else
        o[id].g_count ++;
})
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题