1

我正在从事与此类似的数组的项目

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

4 回答 4

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;}用您自己的逻辑替换恒等函数即可。

于 2013-07-31T07:15:29.833 回答
1

首先,排序时不能消除元素。您必须先对数组进行排序,然后删除重复项。您的解决方案使用Array.prototype.filterandArray.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() 实现相同。

最后一点:请记住,这仅适用于排序数组。

于 2013-07-31T06:58:14.650 回答
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;
}
于 2013-07-31T06:04:18.260 回答
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;
}
于 2013-07-31T07:06:54.103 回答