从数组返回唯一值

时间:2013-08-21 20:49:39

标签: javascript jquery

如果我有一个像下面这样的数组作为例子:

myArray = [1,4,5,1,5];

如何删除所有重复值(本例中的所有1和5)并仅返回唯一元素(本例中为4)。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:4)

我认为

[1,4,5,1,5].filter(function(x, n, self) { 
    return self.indexOf(x) == self.lastIndexOf(x) 
})

使用下划线可能更有效的基于散列的版本:

a =[1, 2, 3, 3, 4, 2, 1, 5]
uniqs = _.chain(a).countBy().pairs().filter(function(x) {
    return x[1] == 1
}).pluck(0).value()

或普通javascript:

a = [1, 2, 3, 3, 4, 2, 1, 5]
hash = {}

a.forEach(function(x) {
    hash[x] = (Number(hash[x]) || 0) + 1
});

uniq = Object.keys(hash).filter(function(n) {
    return hash[n] == 1
});

但请注意,这会将数组值转换为字符串(结果将为["4","5"])。

如果您对正在排序的数组感到满意,您也可以这样做:

a = [1, 2, 3, 3, 4, 2, 1, 5]

uniq = a.sort().filter(function(x, n, self) {
    return x != self[n - 1] && x != self[n + 1];
});

//[4, 5]

第二种和第三种方法有一个严重的限制,它们只能使用原始值 - 你不能“统一”一个对象数组。第一个功能很好用:

x = {x:1}; y = {y:1}; a = [x, y, x, x];
uniq = a.filter(function(x, n, self) { 
    return self.indexOf(x) == self.lastIndexOf(x) 
})
// {"y":1}

对于那些好奇的性能测试(在不同浏览器中非常不一致):http://jsperf.com/efficient-unique/2

答案 1 :(得分:2)

This works,并且比原始搜索(O(nlog(n))而不是O(n^2)),然而确实修改现有数组效率更高。

var unique = [];

myArray.sort();

for (var i=0, j;i<myArray.length;i = j) {
    for (j=i+1;j<myArray.length && myArray[i] === myArray[j]; j++);

    if (j == i + 1) {
        unique.push(myArray[i]);
    }
}

// use unique

正如评论中所讨论的,您还可以利用一个对象并实现O(n)解决方案,但是这种方法的执行时间在不同平台上变化很大(有时比上述解决方案慢,有时候更快) )。

var unique = [], hash = {}, curr;

for (var i=0;i<myArray.length;i++) {
    curr = myArray[i];

    hash[curr] = (Number(hash[curr]) || 0) + 1;
}

for (var x in hash) {
    if (hash[x] === 1) {
        unique.push(x);
    }
}

// use unique

答案 2 :(得分:1)

试试这个: -

var arr = [1,4,5,1,5];
var sorted_arr = arr.sort(); 
var results = [];
for (var i = 0; i < arr.length - 1; i++) {
    if (sorted_arr[i + 1] !== sorted_arr[i]) {
        results.push(sorted_arr[i]);
    }
}

答案 3 :(得分:0)

您可以尝试使用此jquery函数: http://api.jquery.com/jQuery.unique/

“$ .unique()函数搜索对象数组,对数组进行排序,并删除任何重复的节点。”