jQuery - 从字符串数组中删除重复项

35

可能是重复问题:
在JavaScript数组中查找重复值的最简单方法
对字符串数组使用jQuery.unique

我正在尝试通过广度优先搜索获取邻居列表(具体来说是Block'd游戏中相同颜色邻居球的索引),我的function getWholeList(ballid) 返回一个类似于以下数组:

thelist=["ball_1","ball_13","ball_23","ball_1"]

当然,还有重复的元素。

我尝试使用jQuery.unique()函数来移除它们,但是我猜测它不能处理字符串, 所以有没有其他方法可以使这个数组变成唯一的呢?

感谢任何帮助。


请看这个链接:https://dev59.com/eXRA5IYBdhLWcg3wvgsb - kleinohad
@kleinohad:只需将其标记为重复即可。 - Bergi
感谢所有的回答,我在这个主题中找到了所需的函数。 - void
1
对我来说,$.unique 起作用了:http://jsfiddle.net/8RNYF/ - jd.carretero
5个回答

78

jQuery的unique方法仅适用于DOM元素数组。

您可以使用eachinArray方法轻松制作自己的uniqe函数:

function unique(list) {
  var result = [];
  $.each(list, function(i, e) {
    if ($.inArray(e, result) == -1) result.push(e);
  });
  return result;
}

示例:http://jsfiddle.net/Guffa/Askwb/


使用 grep 也是不错的选择:function unique(list) { return $.grep(list, function(n, i) { return list.indexOf(n) == i; }); } - elin

14

作为一个非 jQuery 的解决方案,您可以使用数组 filter 方法来实现:

var thelist=["ball_1","ball_13","ball_23","ball_1"], 
    thelistunique = thelist.filter(
                 function(a){if (!this[a]) {this[a] = 1; return a;}},
                 {}
                );
//=> thelistunique = ["ball_1", "ball_13", "ball_23"]

作为Array.prototype的扩展(使用缩短的filter回调函数)
Array.prototype.uniq = function(){
  return this.filter(
      function(a){return !this[a] ? this[a] = true : false;}, {}
  );
}
thelistUnique = thelist.uniq(); //=> ["ball_1", "ball_13", "ball_23"]

[2017年编辑] ES6的实现方式如下:

const unique = arr => [...new Set(arr)];
const someArr = ["ball_1","ball_13","ball_23","ball_1", "ball_13", "ball_1" ];
console.log( unique(someArr) );


9
试试这个 - Array.unique()。它能帮助你去除数组中的重复元素。
Array.prototype.unique =
  function() {
    var a = [];
    var l = this.length;
    for(var i=0; i<l; i++) {
      for(var j=i+1; j<l; j++) {
        // If this[i] is found later in the array
        if (this[i] === this[j])
          j = ++i;
      }
      a.push(this[i]);
    }
    return a;
  };
thelist=["ball_1","ball_13","ball_23","ball_1"]
thelist=thelist.unique()

8
不过不要在大数组上尝试这个方法,否则复杂度将会呈二次方增长。 - catchmeifyoutry
这会不会同时对数组进行排序?有时候这是不想要的。 - max pleaner

2

这里有一个 PHP array_unique 函数的 JavaScript 版本,链接如下:http://phpjs.org/functions/array_unique

function array_unique (inputArr) {
    var key = '',
        tmp_arr2 = {},
        val = '';

    var __array_search = function (needle, haystack) {
        var fkey = '';
        for (fkey in haystack) {
            if (haystack.hasOwnProperty(fkey)) {
                if ((haystack[fkey] + '') === (needle + '')) {
                    return fkey;
                }
            }
        }
        return false;
    };

    for (key in inputArr) {
        if (inputArr.hasOwnProperty(key)) {
            val = inputArr[key];
            if (false === __array_search(val, tmp_arr2)) {
                tmp_arr2[key] = val;
            }
        }
    }

    return tmp_arr2;
}

或者使用较新的JavaScript:

arr.filter((v, p) => arr.indexOf(v) == p)

2

jQuery.unique() 只适用于 DOM 元素数组。看一下这个(增强版的 unique):

增强版 unique


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接