按升序排序数组,同时消除重复值

时间:2013-07-31 05:55:14

标签: javascript arrays

我正在开展项目,我有一个与此相关的阵列

var sortBp = [ 'height58em', 'width480px', 'width768px', 'width959px', 'width767px', 'width767px' ];

我想按升序对此数组进行排序,同时重复重复值,以便结果为

var sortBp = [ 'height58em', 'width480px', 'width767px', 'width768px', 'width959px' ];

我正在使用以下函数在升序数组中排序数组但是如何消除立即值? (在上面的例子中'width767px'

var sortBp = bpArrays.sort(function(a, b) {
                    a = a.replace(/[a-z]/g, '');
                    b = b.replace(/[a-z]/g, '');
                    return a - b;
}); 

4 个答案:

答案 0 :(得分:1)

首先,你不能在排序时消除元素。您必须先对数组进行排序,然后删除重复项。使用Array.prototype.filterArray.prototype.indexOf的解决方案可能适用于未排序的数组,但由于您的数组已排序,因此这里的开销很大(每个都需要O(n))。相反,您可以循环遍历数组并将元素与之前的元素进行比较。

function uniq(array) {
  var i, l = array.length, result = [];
  for (i = 0; i < l; i++) {
    if (result[result.length - 1] != array[i]) {
      result.push(array[i]);
    }
  }
  return result;
}

这与UnderscorePrototype的uniq()实现相同。

最后注意:请记住,这只适用于排序数组。

答案 1 :(得分:1)

如果这不是作业,即您不需要自己实施算法,则可以使用sortByuniq函数的组合。

sortBp = [ 'height58em', 'width480px', 'width768px', 'width959px', 'width767px', 'width767px' ];
_.uniq(_.sortBy(sortBp, function(x) {return x;}), true);

返回:

["height58em", "width480px", "width767px", "width768px", "width959px"]

请注意,这将按词法顺序排序,如果您不希望这种情况发生,只需将身份函数function(x) {return x;}替换为您自己的逻辑。

答案 2 :(得分:0)

发现它!!

var sortBp = [ 'height58em', 'width480px', 'width768px', 'width959px', 'width767px', 'width767px' ];

uniqueArray = sortBp.filter(function(elem, pos) {
        return sortBp.indexOf(elem) == pos;
});

编辑:

我在这里找到了另一种解决方案:http://dreaminginjavascript.wordpress.com/2008/08/22/eliminating-duplicates/

function eliminateDuplicates(arr) {
      var i, len=arr.length, out=[], obj={};
      for (i=0;i<len;i++) {
        obj[arr[i]]=0;
      }
      for (i in obj) {
        out.push(i);
      }
      return out;
}

答案 3 :(得分:0)

Array.prototype.contains = function(k) {
for ( var p in this)
if (this[p] === k)
  return true;
return false;
};




inputArray.sort();

function uniqueArray(inputArray){
result=[];
for(var i in inputArray){
if(!result.contains(inputArray[i])){
result.push(inputArray[i]);
}
}
return result;
}