Javascript数组排序和唯一

the*_*ack 50 javascript arrays sorting unique

我有一个像这样的JavaScript数组:

var myData=['237','124','255','124','366','255'];
Run Code Online (Sandbox Code Playgroud)

我需要数组元素是唯一的和排序的:

myData[0]='124';
myData[1]='237';
myData[2]='255';
myData[3]='366';
Run Code Online (Sandbox Code Playgroud)

即使数组的成员看起来像整数,它们也不是整数,因为我已经将每个成员转换为字符串:

var myData[0]=num.toString();
//...and so on.
Run Code Online (Sandbox Code Playgroud)

有没有办法在JavaScript中完成所有这些任务?

lon*_*day 136

这其实很简单.如果首先对值进行排序,则更容易找到唯一值:

function sort_unique(arr) {
  if (arr.length === 0) return arr;
  arr = arr.sort(function (a, b) { return a*1 - b*1; });
  var ret = [arr[0]];
  for (var i = 1; i < arr.length; i++) { //Start loop at 1: arr[0] can never be a duplicate
    if (arr[i-1] !== arr[i]) {
      ret.push(arr[i]);
    }
  }
  return ret;
}
console.log(sort_unique(['237','124','255','124','366','255']));
//["124", "237", "255", "366"]
Run Code Online (Sandbox Code Playgroud)

  • 经过9次尝试失败后,Randall Munroe的StackSort将我送到这里,很好的例子:P https://gkoberger.github.io/stacksort/ (212认同)
  • 尝试了15次,但StackSort让我来到这里. (33认同)
  • 做"a*1 - b*1"而不仅仅是"a - b"有什么意义? (10认同)
  • @FiHoran似乎每次来这里! (5认同)
  • 感谢 Reddit 上的一个帖子,一个已有 7 年历史的 PR 刚刚被合并到了 [stacksort 网站](https://gkoberger.github.io/stacksort/)。点赞来了——这将再次变得炙手可热。https://github.com/gkoberger/stacksort/pull/4 (5认同)
  • 它失败超过2个重复!这个函数更好:`function unique(arr){var a = []; var l = arr.length; for(var i = 0; i <l; i ++){for(var j = i + 1; j <l; j ++){//如果稍后在数组中找到[i] if(arr [i] = == arr [j])j = ++ i; } a.push(arr [i]); }返回; };` (3认同)
  • @lonesomeday [stacksort网站](http://gkoberger.github.io/stacksort/)今天在codeproject新闻信中 (2认同)

小智 35

在您无法预先定义函数的情况下(例如在书签中),这可能就足够了:

myData.sort().filter(function(el,i,a){return i===a.indexOf(el)})
Run Code Online (Sandbox Code Playgroud)

  • `myData.sort().filter(function(el,i,a){return i == a.indexOf(el);})` (9认同)
  • `myData.sort().filter(function(el,i,a){return!i || el!= a [i-1];})` (3认同)
  • 在IE8上失败,寂寞的日子工作得更好 (2认同)

met*_*uzz 19

您现在可以达到的效果,在短短一个行代码.

使用新的Set将数组减少为唯一的值集.之后应用sort方法来排序字符串值.

var myData=['237','124','255','124','366','255']

var uniqueAndSorted = [...new Set(myData)].sort() 
Run Code Online (Sandbox Code Playgroud)

修订以来问题的时间在JavaScript中引入了新的方法.


iol*_*leo 16

function sort_unique(arr) {
    return arr.sort().filter(function(el,i,a) {
        return (i==a.indexOf(el));
    });
}
Run Code Online (Sandbox Code Playgroud)

  • `filter`也不是jQuery.这将是`$ .filter`. (4认同)

pha*_*aux 13

这是我(更现代)的方法Array.protoype.reduce():

[2, 1, 2, 3].reduce((a, x) => a.includes(x) ? a : [...a, x], []).sort()
// returns [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

编辑:评论中指出的更高性能版本:

arr.sort().filter((x, i, a) => !i || x != a[i-1])
Run Code Online (Sandbox Code Playgroud)

  • 这是一个不错的选择,但当数组很大时速度很慢 - 归约的时间复杂度为 O(n^2),因为你为每个元素调用“indexOf”,然后最后的排序为 O(n log n)。一旦你对它进行排序,你只需要线性时间来删除重复项:) (2认同)

gla*_*mpr 8

怎么样:

array.sort().filter(function(elem, index, arr) {
  return index == arr.length - 1 || arr[index + 1] != elem
})
Run Code Online (Sandbox Code Playgroud)

这类似于@loostro的答案,但不是使用indexOf,它将重复每个元素的数组以验证它是第一个找到的,它只检查下一个元素是否与当前元素不同.


Ray*_*nos 6

尝试使用像下划线这样的外部库

var f = _.compose(_.uniq, function(array) {
    return _.sortBy(array, _.identity);
});

var sortedUnique = f(array);
Run Code Online (Sandbox Code Playgroud)

这依赖于_.compose,_.uniq,_.sortBy,_.identity

查看实例

它在做什么?

我们需要一个接受数组的函数,然后返回一个已删除非唯一条目的已排序数组.这个函数需要做两件事,排序和使数组唯一.

这对于合成来说是一个很好的工作,因此我们将独特的排序功能组合在一起._.uniq可以只使用一个参数应用于数组,因此它只是传递给_.compose

_.sortBy函数需要排序条件函数.它需要一个返回值的函数,数组将按该值排序.由于我们排序的值是数组中的值,我们可以传递_.identity函数.

我们现在有一个函数组合(接受一个数组并返回一个唯一的数组)和一个函数(接受一个数组并返回一个排序的数组,按其值排序).

我们只是在数组上应用组合,我们有唯一排序的数组.


Vic*_*tor 5

对于两个以上的重复值,此函数不会失败:

function unique(arr) {
    var a = [];
    var l = arr.length;
    for(var i=0; i<l; i++) {
        for(var j=i+1; j<l; j++) {
            // If a[i] is found later in the array
            if (arr[i] === arr[j])
              j = ++i;
        }
        a.push(arr[i]);
    }
    return a;
};
Run Code Online (Sandbox Code Playgroud)