如何在数组中获得唯一值的列表?我总是必须使用第二个数组,或者在JavaScript中有类似于java的hashmap的东西吗?

我将只使用JavaScript和jQuery。不能使用其他库。


当前回答

一行代码,纯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+

其他回答

下面是一个可定制的equals函数的方法,它可以用于原语以及自定义对象:

Array.prototype.pushUnique = function(element, equalsPredicate = (l, r) => l == r) {
    let res = !this.find(item => equalsPredicate(item, element))
    if(res){
        this.push(element)
    }
    return res
}

用法:

//with custom equals for objects
myArrayWithObjects.pushUnique(myObject, (left, right) => left.id == right.id)

//with default equals for primitives
myArrayWithPrimitives.pushUnique(somePrimitive)

再想想这个问题。下面是我用更少的代码实现这一目标的方法。

var distinctMap = {}; var testArray = ['John', 'John', 'Jason', 'Jason']; For (var I = 0;i < testArray.length;我+ +){ var值= testArray[i]; distinctMap[value] = "; }; var unique_values = Object.keys(distinctMap); console.log (unique_values);

如果您不需要太担心旧的浏览器,这正是set的设计目的。

Set对象允许您存储任何类型的惟一值 原语值或对象引用。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set

const set1 = new Set([1, 2, 3, 4, 5, 1]);
// returns Set(5) {1, 2, 3, 4, 5}

上面的大多数解决方案都具有较高的运行时复杂性。

下面是使用reduce的解决方案,可以在O(n)时间内完成工作。

Array.prototype.unique = Array.prototype.unique || function() { Var arr = []; 这一点。Reduce(函数(哈希,num) { If (typeof hash[num] === 'undefined') { Hash [num] = 1; arr.push (num); } 返回哈希; }, {}); 返回arr; } var myArr = [3,1,2,3,3,3]; console.log (myArr.unique ());/ /(3、1、2);

注意:

这个解决方案不依赖于reduce。其思想是创建一个对象映射,并将唯一的对象推入数组。

你可以输入带有重复元素的数组,下面的方法将返回带有唯一元素的数组。

function getUniqueArray(array){
    var uniqueArray = [];
    if (array.length > 0) {
       uniqueArray[0] = array[0];
    }
    for(var i = 0; i < array.length; i++){
        var isExist = false;
        for(var j = 0; j < uniqueArray.length; j++){
            if(array[i] == uniqueArray[j]){
                isExist = true;
                break;
            }
            else{
                isExist = false;
            }
        }
        if(isExist == false){
            uniqueArray[uniqueArray.length] = array[i];
        }
    }
    return uniqueArray;
}