从数组中获取ALREADY唯一的项目

时间:2017-10-05 02:12:09

标签: javascript arrays

我试图非常开心地说出我的问题,因为它看起来像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的环境中进行编码,而且我不知道我是否可以包含库。

3 个答案:

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