我有一组数字,我需要确保它们是唯一的。我在互联网上找到了下面的代码片段,它工作得很好,直到数组中有一个零。我在Stack Overflow上找到了另一个脚本,看起来几乎与它完全一样,但它不会失败。

所以为了帮助我学习,有人能帮我确定原型脚本哪里出错吗?

Array.prototype.getUnique = function() {
 var o = {}, a = [], i, e;
 for (i = 0; e = this[i]; i++) {o[e] = 1};
 for (e in o) {a.push (e)};
 return a;
}

重复问题的更多答案:

从JS数组中删除重复值

类似的问题:

获取数组中的所有非唯一值(即:重复/多次出现)


当前回答

One Liner,纯JavaScript

使用ES6语法

list=list.filter((x,i,a)=>a.indexOf(x)==i)

x --> item in array
i --> index of item
a --> array reference, (in this case "list")

使用ES5语法

list = list.filter(function (x, i, a) { 
    return a.indexOf(x) == i; 
});

浏览器兼容性:IE9+

其他回答

如果您对额外的依赖关系感到满意,或者您的代码库中已经有一个库,那么可以使用LoDash(或Undercore)从阵列中删除重复项。

用法

如果您的代码库中还没有它,请使用npm安装它:

npm install lodash

然后按如下方式使用:

import _ from 'lodash';
let idArray = _.uniq ([
    1,
    2,
    3,
    3,
    3
]);
console.dir(idArray);

输出:

[ 1, 2, 3 ]

我知道这个问题已经解决了。。。但是没有人提到linq的javascript实现。然后就可以使用.dispect()方法了,这使得代码非常容易阅读。

var Linq = require('linq-es2015');
var distinctValues =  Linq.asEnumerable(testValues)
            .Select(x)
            .distinct()
            .toArray();

var测试值=[1,2,3,4,5,6,7,8,9,0,1,2,1];var distinctValues=可枚举.asEnumerable(测试值).dispect().toArray();console.log(distinctValues);<script src=“https://npmcdn.com/linq-es5/dist/linq.js“></script>

我发现了一个使用jQuery的好方法

arr = $.grep(arr, function(v, k){
    return $.inArray(v ,arr) === k;
});

注:这段代码是从Paul Irish的打鸭子帖子中提取的-我忘记了给学分:P

使用字段[2]作为Id,创建唯一数组数组:

常量arr=[['497','Q0','WTX091-B06-138','0','1.000000','GROUP001'],['497','Q0','WTX091-B09-92','1','0.866899288','GROUP001'],['497','Q0','WTX091-B09-92','2','0.846036819','GROUP001'],['497','Q0','WTX091-B09-57','3','0.835025326','GROUP001'],['497','Q0','WTX091-B43-79','4','0.765068215','GROUP001'],['497','Q0','WTX091-B43-56','5','0.764211464','GROUP001'],['497','Q0','WTX091-B44-448','6','0.761701704','GROUP001'],['497','Q0','WTX091-B44-12','7','0.761701704','GROUP001'],['497','Q0','WTX091-B49-128','8','0.747434800','GROUP001'],['497','Q0','WTX091-B18-17','9','0.746724770','GROUP001'],['497','Q0','WTX091-B19-374','10','0.733379549','GROUP001'],['497','Q0','WTX091-B19-344','11','0.731421782','GROUP001'],['497','Q0','WTX091-B09-92','12','0.726450470','GROUP001'],['497','Q0','WTX091-B19-174','13','0.712757036','GROUP001']];arr.filter((val1,idx1,arr)=>~val1.indexOf(val1[2])&&!(arr.filter((val2,idx2)=>~val2.indexOf(val1[2])&&idx2<idx1).长度));控制台日志(arr);

不扩展Array.prototype(据说这是一种糟糕的做法)或使用jquery/下划线,您可以简单地过滤数组。

通过保留最后一次出现:

    function arrayLastUnique(array) {
        return array.filter(function (a, b, c) {
            // keeps last occurrence
            return c.indexOf(a, b + 1) < 0;
        });
    },

或首次出现:

    function arrayFirstUnique(array) {
        return array.filter(function (a, b, c) {
            // keeps first occurrence
            return c.indexOf(a) === b;
        });
    },

嗯,它只是javascript ECMAScript 5+,这意味着只有IE9+,但它很适合用原生HTML/JS(Windows应用商店应用程序、Firefox OS、Sencha、Phonegap、Titanium…)开发。