仅获取数组的唯一值

时间:2019-09-01 03:08:42

标签: javascript reactjs

我是javascript的新手,我尝试过使用distinct,但它不是我想要的

示例数组:

let arr = [ {key:"1",value:"dog"},
            {key:"1",value:"dog"},
            {key:"2",value:"cat"},
            {key:"3",value:"bird"},
            {key:"3",value:"bird"},
          ]

在我尝试的代码上,它只是删除了

之类的重复项
[ {key:"1",value:"dog"},
  {key:"2",value:"cat"},
  {key:"3",value:"bird"}, ]

我怎么只能得到

[ {key:"2",value:"cat"} ]

我的意思是只有一个没有重复项并删除那些完全相同的数组吗?

5 个答案:

答案 0 :(得分:1)

您可以将对象映射到对象的字符串化版本,以便随后可以使用.indexOf.lastIndexOf()比较找到的对象是否出现在数组的不同位置,以及最后一个索引和第一个索引出现在同一位置,那么可以说它们是同一对象(即:不存在重复对象),可以像这样保存在结果数组中:

const arr = [{key:"1",value:"dog"},{key:"1",value:"dog"},{key:"2",value:"cat"},{key:"3",value:"bird"},{key:"3",value:"bird"}];

const searchable = arr.map(JSON.stringify);
const res = arr.filter((obj, i) => {
  const str = JSON.stringify(obj);
  return searchable.indexOf(str) === searchable.lastIndexOf(str);
});
console.log(res);

答案 1 :(得分:0)

您可以使用reduceMap

let arr = [{key:"1",value:"dog"},{key:"1",value:"dog"},{key:"2",value:"cat"},{key:"3",value:"bird"},{key:"3",value:"bird"}]

let mapper = arr.reduce( (op,inp) => {
  let {key} = inp
  op.set(key, op.get(key) || {value: inp, count:0})
  op.get(key).count++
  return op
},new Map())


let final = [...mapper.values()].reduce((op,{value,count}) => {
   if(count === 1){
    op.push(value)
   }
   return op
},[])

console.log(final)

答案 2 :(得分:0)

如果可以使用下划线或lodash之类的Javascript库,建议您查看其库中的_.xorBy函数。来自lodash:

_.xorBy([arrays], [iteratee=_.identity])

基本上,您传入的数组是此处的对象文字,然后传入想要在原始数据数组中所有出现重复删除的属性,如下所示:

var data = [ {key:"1",value:"dog"}
          , {key:"1",value:"dog"}
          , {key:"2",value:"cat"}
          , {key:"3",value:"bird"}
          , {key:"3",value:"bird"}
          ];
var non_duplidated_data = _.xorBy(data, 'key'); 

来源-https://lodash.com/docs/4.17.14#xorBy

答案 3 :(得分:0)

使用“ find”方法,您将准确找到要寻找的“ {key:” 2“,value:” cat“}”“。

arr.find((item, index) => {
  const foundDup = arr.find((s, sIndex) => sIndex !== index && s.key === item.key);
  return !foundDup;
});

答案 4 :(得分:0)

如果您不介意使用库,我强烈建议您使用“ ramda”库。

const arr = [ {key:"1",value:"dog"}
          , {key:"1",value:"dog"}
          , {key:"2",value:"cat"}
          , {key:"3",value:"bird"}
          , {key:"3",value:"bird"}
          ];
const result = R.uniq(arr);

结果将是:

[{"key": "1", "value": "dog"}, {"key": "2", "value": "cat"}, {"key": "3", "value": "bird"}]

您也可以使用“ lodash”或其他类似的库。