数组去重问题

var arr = [{
    objectId:   "ElAhui90MF",
     UserID:   "44ec32da-8c76-4820-a63c-cc64cbd855b5",
     RecorderID:   "32193ba3-a3e3-4522-b34f-df9d7670781c",
     Time:   "2017-08-1",
     RecorderName:   "王明与"
}, {
    objectId:   "ElAhui90MF",
     UserID:   "44ec32da-8c76-4820-a63c-cc64cbd855b5",
     RecorderID:   "32193ba3-a3e3-4522-b34f-df9d7670781c",
     Time:   "2017-08-2",
     RecorderName:   "王明与"
}, {
    objectId:   "ElAhui90MF",
     UserID:   "44ec32da-8c76-4820-a63c-cc64cbd855b5",
     RecorderID:   "32193ba3-a3e3-4522-b34f-df9d7670781c",
     Time:   "2017-08-2",
     RecorderName:   "王明与"
},{
    objectId:   "ElAhui90MF",
     UserID:   "44ec32da-8c76-4820-a63c-cc64cbd855b5",
     RecorderID:   "32193ba3-a3e3-4522-b34f-df9d7670781c",
     Time:   "2017-08-3",
     RecorderName:   "王明与"
},{
    objectId:   "ElAhui90MF",
     UserID:   "44ec32da-8c76-4820-a63c-cc64cbd855b5",
     RecorderID:   "32193ba3-a3e3-4522-b34f-df9d7670781c",
     Time:   "2017-08-3",
     RecorderName:   "王明与"
},{
    objectId:   "ElAhui90MF",
     UserID:   "44ec32da-8c76-4820-a63c-cc64cbd855b5",
     RecorderID:   "32193ba3-a3e3-4522-b34f-df9d7670781c",
     Time:   "2017-08-3",
     RecorderName:   "王明与"
}];

这样一个数组,需要循环遍历吧Time相同的放入一个新数组

阅读 3.4k
7 个回答
var arrNew = [];
for (var i = 0; i < arr.length; i++) {
    var len = arr.length;
    for (var j = i + 1; j < arr.length; j++) {
        if(arr[i].Time === arr[j].Time){
            arrNew.push(arr[j]);
            arr.splice(j,1);
            j--
        }
    }
    if(len !== arr.length){
        arrNew.unshift(arr[i]);
    }
}

突然想到一种更简洁的方法

var arrNew = arr.filter(function(x){
        for (var i = 0; i < arr.length; i++) {
            if(x.Time.indexOf(arr[i].Time) !== -1 && x !== arr[i]){
                return x;
            }
        }
    })

其实可以按照ObjectId先排序以下再单循环一遍去重

var l = arr.length;
function searchRepeat(node,type){       
for (var i = 0; i < node.length; i++) {
for (var j = i + 1; j < l; j++) {
  if (node[i][type] == node[j][type]){
     node.splice(j,1);    
     j--;
     l--;
  }
}
}
return node;
}
console.log(searchRepeat(arr,'Time'));

Object.values(arr.reduce((obj, cur) => ({ ...obj, [cur.Time]: [...(obj[cur.Time] || []), cur] }), {}))

groupby = arr.reduce((prev, item)=>{
        if (!(item.Time in prev)){prev[item.Time]=[]};
        prev[item.Time].push(item);
        return prev;
    },
{});

console.log(groupby)
        let m = new Map();
        arr.map(v => m.set(v.Time, v))
        let new_arr=[...m.values()];

主要用到Array类型原型链上的reduce和filter方法。
sort将Time属性按时间升序,为reduce做准备。
reduce依次比较数组对象,重置重复对象为null。
filter过滤null对象,将唯一对象填充到新数组中。

var arrNew = [];
mapObj = (arr)=>{
    arr.sort((x,y)=>(x.Time>y.Time));
    arr.reduce(function(accumulator, currentValue, currentIndex, array){  
        if(accumulator.Time === currentValue.Time){
            array[currentIndex-1]=null;
        }
        return currentValue;
        
    });
    return arrNew=arr.filter((subarr)=>{return subarr!=null})
};
console.log(mapObj(arrOld));
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题