获取数组中唯一的值

3

我是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个回答

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);


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)


1
这是我想要的,我不知道reduce的作用,谢谢伙计。 - hero to zero

0
如果您可以使用Javascript库,例如underscore或lodash,我建议查看它们库中的_.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


0
使用“find”方法,你将会得到精确地匹配你正在寻找的"{key:"2",value:"cat"}"。
arr.find((item, index) => {
  const foundDup = arr.find((s, sIndex) => sIndex !== index && s.key === item.key);
  return !foundDup;
});

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”或其他类似的库。

OP只想要出现一次的条目,而不仅仅是删除重复值。 - Code Maniac
这不是一样的吗?如果你删除重复项,你将得到只出现一次的条目。 - mssoheil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接