我试图非常开心地说出我的问题,因为它看起来像jQuery function to get all unique elements from an array?和其他一些线程的副本。我需要非常清楚,我想从数组中获取所有不重复的元素。也就是说,给定一个数组[1,2,3,4,5,1,2,3,5],它应该返回[4]。在另一个主题中,我正在失去理智,因为我不明白他们为什么使用“独特”这个词,这意味着"成为同类中唯一的一个;不像其他任何东西。"并且构建返回已重复多次的数字的函数,只是在问这个问题时我才明白他们是如何解释这个问题的。环顾网络,似乎每个人都在诠释它。
我觉得这里的代码非常接近:
var myArr = [1,2,3,4,5,1,2,3,5];
var unique = myArr.filter(function(value, index, self){
return self.indexOf(value) != index;
});
console.log(unique);

返回一个数组,其中包含数组中的每个值,但不会重复的数组。如果我可以将删除的元素分配给唯一,我会被设置,但即使阅读过滤器上的文档,我也很难理解它是如何工作的。
我更喜欢vanilla js,因为我在FreeCodeCamp的环境中进行编码,而且我不知道我是否可以包含库。
答案 0 :(得分:2)
关闭...排序...只检查indexOf是否与lastIndexOf相同
var myArr = [1,2,3,4,5,1,2,3,5];
var unique = myArr.filter(function(value, index, self){
return self.indexOf(value) === self.lastIndexOf(value);
});
console.log(unique);

答案 1 :(得分:0)
你确实很亲密,@ Jaromanda-X在他的评论return self.indexOf(value) === self.lastIndexOf(value);
中给了你解决方案。你会像这样使用这行:
var myArr = [1,2,3,4,5,1,2,3,5];
var unique = myArr.filter(function(value, index, self){
return self.indexOf(value) === self.lastIndexOf(value);
});
console.log(unique);
作为参考,.indexOf
返回数组中值的第一个索引,.lastIndexOf
返回数组中值的最后一个索引。
答案 2 :(得分:0)
利用indexOf
的解决方案需要对每个元素进行线性搜索,因此性能复杂度为O(N ^ 2)。
这是一个两步解决方案。它存储一个数字列表及其计数,然后从该列表中找到计数为1的元素。
let myArr = [1,2,3,4,5,1,2,3,5];
let counts = myArr.reduce((ht, v) => { ht[v] = (ht[v] || 0) + 1; return ht;} {});
let unique = Object.keys(counts).filter(k => counts[k] === 1).map(v => parseInt(v, 10));
此解决方案假定myArr
中的每个项目都是一个数字。如果数组是数字和字符串的混合,并且您想保留该类型,则可以将其修改为此解决方案(感谢@JaromandaX):
let myArr = [1,2,3,4,5,'apple',1,2,3,5];
let counts = myArr.reduce((ht, v) => {
ht[v] = ht[v] || {v, count:0};
ht[v].count +=1;
return ht;
}, {});
let unique = Object.keys(counts)
.filter(k => counts[k].count === 1)
.map(k => counts[k].v);
但像[1, 1, 2, "2"]
这样的数组呢?上面的解决方案从对象的字符串表示中获取其键,因此数字2
和字符串"2"
将被视为等效。
解决方法是使用类型和值的组合生成密钥。
let myArr = [1,2,3,4,5,'apple',1,"2",3,5];
let counts = myArr.reduce((ht, v) => {
let k = `${typeof(v)};${v}`;
ht[k] = ht[k] || {v, count:0};
ht[k].count +=1;
return ht;
}, {});
let unique = Object.keys(counts)
.filter(k => counts[k].count === 1)
.map(k => counts[k].v);