jQuery.unique()没有返回完全不同的值

时间:2011-11-15 14:20:18

标签: jquery

我正在使用'jQuery.unique()'函数将不同的数组值从一个数组放到另一个数组中,但第二个数组中的值似乎不包含不同的值。

var nonuniqueArray = ['AMI:8244','AMI:29126','AMI:31591','AMI:31591','AMI:31591','AMI:31591','AMI:29126'];
uniqueArray = $j.unique(nonuniqueArray);
alert (uniqueArray);

提醒的值为:AMI:29126,AMI:31591,AMI:29126,AMI:8244

我注意到如果数组中的相似值组合在一起,那么它工作正常,例如,如果'AMI:29126'组合在一起,似乎没问题。

对上述代码有什么问题的任何建议都是最受欢迎的。

非常感谢:)

5 个答案:

答案 0 :(得分:4)

不会为此创建$ .unique,请参阅以下网址:http://api.jquery.com/jQuery.unique/

  

$ .unique()函数搜索对象数组,进行排序   数组,并删除任何重复的节点。 此功能仅适用   在DOM元素的纯JavaScript数组上,主要使用   在内部由jQuery。

你可以做的是先将它排序然后使用唯一的,这不是它的确切位置,但它有效。

var nonuniqueArray = ['AMI:8244','AMI:29126','AMI:31591','AMI:31591','AMI:31591','AMI:31591','AMI:29126'];
var sortedArray = Array.sort(nonuniqueArray );
var unique = $.unique(sortedArray);

$.each(unique , function(k, v){
    $("div").append(v + "<br />");
});

结果:

AMI:8244
AMI:31591
AMI:29126

现场演示:http://jsfiddle.net/9x4dR/

答案 1 :(得分:3)

这里是如何使用常规Array方法执行此操作的,但我会注意到indexOf()是一种较新的数组方法,并且在IE7或更早版本中无法工作,但很容易通过1循环重复< / p>

var nonuniqueArray = ['AMI:8244','AMI:29126','AMI:31591','AMI:31591','AMI:31591','AMI:31591','AMI:29126'];

function distinctVal(arr){
    var newArray = [];
    for(var i=0, j=arr.length; i<j; i++){
        if(newArray.indexOf(arr[i]) == -1)
              newArray.push(arr[i]);  
    }
    return newArray;
}

var uniqueArray = distinctVal(nonuniqueArray);
alert(uniqueArray);

答案 2 :(得分:1)

您不能对字符串数组使用jQuery unique方法。它只适用于DOM元素的数组。来自docs

  

在适当的位置对DOM元素数组进行排序,并删除重复项。   请注意,这仅适用于DOM元素的数组,而不适用于字符串或   号。

答案 3 :(得分:0)

这是一个比Marlin解决方案更高效和兼容的示例。 indexOf对大型数组的查找有点昂贵,因此对于字符串来说,创建临时对象要好得多:

function strUnique(arr) {
    var obj = {},
        ret = [],
        i   = arr.length;

    while (i--) {
        if (!obj[arr[i]]) {
            obj[arr[i]] = true;
            ret.unshift(arr[i]);
        }
    }

    return ret;
}

如果订单很重要,您可能希望向前工作而不是向后工作。如果是这样,你需要相应地调整循环。

答案 4 :(得分:0)

在ES6中你可以这样做:

Array.prototype.unique = function() {
    let newArray = [];
    for(let i=0, j=this.length; i<j; i++){
        if(newArray.indexOf(this[i]) == -1) newArray.push(this[i]);
    }
    this.splice(0, this.length, ...newArray);
}

然后按yourarray.unique()运行它(它在原地工作)。如果您不使用ES6,可以用以下代码替换它:this.splice(0, this.length, ...newArray);(我不测试下面的代码):

this.splice(0, this.length)
for(el of newArray) { this.push(el) }