我已经看到了很多有关此主题的答案,但我并不完全满意。我最喜欢的片段是这个:
[ ["1", "2"], ["1", "2", "3"], ["1", "2"] ]
.filter(
(path: string[], i: number, array: string[][]) => _.findIndex(array, x => _.isEqual(x, path)) === i
)
这有效,但是我觉得它太冗长了,不适合我的喜好。是否有更紧凑的方法来实现这一目标?即使这意味着使用lodash之类的东西。我觉得我在2019年(2020年左右)确实缺少一些明显的东西。
答案 0 :(得分:1)
您可以进行一堆关闭操作,并使用Set
和一个字符串值进行检查。
var array = [["1", "2"], ["1", "2", "3"], ["1", "2"]],
unique = array.filter(
(s => a =>
(j => !s.has(j) && s.add(j))
(JSON.stringify(a))
)
(new Set)
);
console.log(unique);
答案 1 :(得分:1)
使用lodash,您可以使用_.uniqWith()
对数组进行重复数据删除,并使用_.isEqual()
作为比较器:
const array = [["1", "2"], ["1", "2", "3"], ["1", "2"]]
const result = _.uniqWith(array, _.isEqual)
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>
答案 2 :(得分:-1)
实际上有很多方法,请尝试在浏览器控制台中播放。我通常对原语使用最直接的方法:
const uniques = [...new Set(originalArray)]
对于较难的物体:
const uniques = original.reduce((result, object) => {
if (!result.find((o) => i._id === object._id)) {
result.push(object);
}
return result;
}, [])