【问题标题】:Removing duplicates in array of objects [duplicate]删除对象数组中的重复项[重复]
【发布时间】:2012-11-24 11:54:49
【问题描述】:

可能重复:
Remove duplicates from an array of objects in javascript

var arr = [{empID:100,empName:greg},{empID:101,empName:Math},{empID:100,empName:greg}];
var sorted_arr = arr.sort(); // You can define the comparing function here. 
                             // JS by default uses a crappy string compare.
var results = [];
for (var i = 0; i < arr.length - 1; i++) {
    if (sorted_arr[i + 1].empID != sorted_arr[i].empID) {
        results.push(sorted_arr[i]);
    }
}

alert(results);

我有一个对象数组,但是当我尝试删除与 ID 匹配的重复对象时,它不会被删除。代码有什么问题。

【问题讨论】:

  • 其实这应该是正确的,这就是chrome返回给我的:[{"empID":100,"empName":"greg"},{"empID":101,"empName":"Math"}]如果你说的是结果数组中的元素jsbin.com/uwulun/1/edit
  • 您的数组可能不是按empID 排序的,而是按对象哈希排序的。

标签: javascript


【解决方案1】:

你的代码有两个问题:

  1. 排序不起作用
  2. 您忘记将最后一个元素添加到结果中

我建议以下替代方案:

var arr = ...;
arr.sort( function( a, b){ return a.empID - b.empID; } );

// delete all duplicates from the array
for( var i=0; i<arr.length-1; i++ ) {
  if ( arr[i].empID == arr[i+1].empID ) {
    delete arr[i];
  }
}

// remove the "undefined entries"
arr = arr.filter( function( el ){ return (typeof el !== "undefined"); } );

【讨论】:

  • 使用arr.splice(i, 1) 代替delete arr[i]。删除只是用“未定义”替换该项目,但不会从数组中删除它。
  • @ajkochanowicz 虽然我没有任何证据,但我认为上面的代码更好,因为它只创建一个新数组一次,而使用splice() 会在每次找到重复项时创建一个新数组. (从而触发不必要的 GC 运行)。
  • 实际上,每个数组项的索引不变是很好的——这在循环中间可能很危险。
  • 您也可以像这样检查循环内的 arr[i+1] 是否未定义: if ( arr[i+1] && arr[i].empID === arr[i +1].empID )。当循环转到最后一项时,这一点很重要。
【解决方案2】:

如果empID 保证是一个字符串或数字,我会跳过排序步骤并使用一个对象作为已经看到的 ID 的哈希:

var arr = [
    {empID:100,empName:"greg"},
    {empID:101,empName:Math},
    {empID:100,empName:"greg"}
];

var results = [];
var idsSeen = {}, idSeenValue = {};
for (var i = 0, len = arr.length, id; i < len; ++i) {
    id = arr[i].empID;
    if (idsSeen[id] !== idSeenValue) {
        results.push(arr[i]);
        idsSeen[id] = idSeenValue;
    }
}

【讨论】:

    【解决方案3】:

    如果您要比较项目n and n+1,您的sort 函数应该真正使用比较器

    var sorted_arr = arr.sort(function(a,b) { return a.empID - b.empID; } );
    

    这样可以确保列表中的连续项目可能具有重复的empID 属性。

    【讨论】:

      猜你喜欢
      • 2017-04-10
      • 2019-02-28
      • 1970-01-01
      • 1970-01-01
      • 2017-09-01
      • 1970-01-01
      • 2022-12-05
      • 2016-03-12
      相关资源
      最近更新 更多