【问题标题】:Find unique element in an array of objects using Set doesn't work使用 Set 在对象数组中查找唯一元素不起作用
【发布时间】:2017-07-19 05:10:18
【问题描述】:

我有一个对象数组,我试图从中获取独特的元素。我尝试使用 Set 来获取独特的元素。它不适用于对象数组,但适用于字符串数组等。

如何使用 set 实现这一点?

let data =[{"name":"tagName2"},{"name":"tagName2"}];
console.log(data);  //[ { name: 'tagName2' }, { name: 'tagName2' } ]
console.log((new Set(data)));  //Set { { name: 'tagName2' }, { name: 'tagName2' } }

【问题讨论】:

  • 这是两个不同的对象。对象只有在引用相同位置时才相等。
  • 没有可以覆盖的接口来建立等效性 - 现在它是普通的旧 javascript。
  • 易于检查:({ name: 'tagName2' }) == ({ name: 'tagName2' }) 产生 false
  • 定义数组外的对象并推送
  • @azad 数据实际上来自该格式的 API 请求

标签: javascript arrays duplicates set


【解决方案1】:

您可以先过滤具有唯一对象的数组,然后将其传递给Set,如下所示:

let data =[{"name":"tagName2"},{"name":"tagName2"}];

uniqueData=removeDuplicates(data, "name");

console.log((new Set(uniqueData)));  //Set {{ name: 'tagName2' }}

function removeDuplicates(data, param){
    return data.filter(function(item, pos, array){
        return array.map(function(mapItem){ return mapItem[param]; }).indexOf(item[param]) === pos;
    })
}

【讨论】:

    【解决方案2】:

    来自docs

    Set 对象允许您存储任何类型的唯一值,无论是 原始值或对象引用

    正如@Tushar 所指出的,这两个对象是不同的。 Set 过滤掉引用同一对象的对象。

    要使Set 工作,您需要传入两个引用同一对象的对象。查看this fiddle。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-19
      • 2023-03-16
      • 2017-09-14
      • 1970-01-01
      相关资源
      最近更新 更多