请问如何删除数组中只要出现重复的元素就删除

clipboard.png

比如这三条数据重复,那就删除全部重复的,只留0,1数组

阅读 5.1k
10 个回答
var a = [{material_id : '29', name : '点塑布'}, {material_id : '14', name : '沙发布'}, {material_id : '54'}, {material_id : '51'}, {material_id : '53'}, {material_id : '54'}, {material_id : '53'}, {material_id : '51'}],
n = a.reduce(function(p, n) {
  return p.push(n.material_id), p;
}, []).filter(function(e, i, a) {
  return a.indexOf(e) !== i;
}),
m = a.filter(function(e) {
  return n.indexOf(e.material_id) === -1;
});
alert(JSON.stringify(m)); // [{material_id : '29', name : '点塑布'}, {material_id : '14', name : '沙发布'}]

没细看问题,如果要删除所有的重复的数据答案为

本题方案

var array = ...;  counts = {}; l = array.length;

array.forEach(function(item) {
  counts[item.id] = (counts[item.id] || 0) + 1;
})
  

array.filter(function(item) {
  return counts[item.id] == 1;
})

非本题答案,数组去重方案

ES6可以用set

result = Array.from(new Set(arr));

另外也可以使用filter去重。

  result = arr.filter(function(item, pos,self) {
    return self.indexOf(item) == pos;
  });

如果数据量大使用Array.indexOf效率就相对低点

可以参考:JavaScript删除数组里重复的元素

思路 代码就不写了

去重把 把去重的元素拿出来 然后去遍历数据 删除去重的元素 也就是重复的元素

用indexOf()

能用es6 可以试试set(),不能的话就老老实实地去重。
js很好写

var xxx=[1,2,3,9,4,5,7,1,3,4];
var res =[];
for(var i= 0; i<xxx.length;i++){
    var d = res.indexOf(xxx[i])
    if(d == -1){
        res[i] = xxx[i]
    }
}
console.log(res)

空间复杂度 n
时间复杂度 n
去重的话前半部分是去重后半部分是过滤重复元素自身也删除

function unique(nums,key) {
    var obj = {};
    var index = 0;
    for (var i = 0, len = nums.length; i < len; i++) {
        if (!obj[nums[i][key]]) {
            obj[nums[i][key]] = 1;
            nums[index++] = nums[i]
        } else {
            obj[nums[i][key]] = obj[nums[i][key]] + 1;
        }
    }
    var index2 = 0;
    for (var i = 0; i < index; i++) {
        if (obj[nums[i][key]] === 1) {
            nums[index2++] = nums[i]
        }
    }
    nums.length = index2;
    return index2;
}
console.log(unique(arr,"material_id"));
(array) => {
  const newArr = [];
  for(let i = 0, len = array.length; i< len; i++) {
    if (newArr.indexOf(array[i]) === -1) {
      newArr.push(array[i]);
    }
  }
  return newArr;
}
                var arr=res.data.results;
                Array.prototype.removeRepeatAttr=function(){
                    var tmp={},a=this.slice();
                    for(var i=j=0;i<a.length;i++){
                        if(!tmp[a[i].adpinfo.adptitle]){
                            tmp[a[i].adpinfo.adptitle]=!0;
                            j++;
                        }else{
                            this.splice(j,1);
                        }
                    };
                }
                arr.removeRepeatAttr();

支持es6么,可以看看set()

思路:计数+过滤

const counts = arr.reduce((m, x) => (m[x.material_id] = (m[x.material_id] || 0) + 1, m), {})
const newArr = arr.filter(x => counts[x.material_id] === 1)
推荐问题