我正在开展项目,我有一个与此相关的阵列
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;
});
答案 0 :(得分:1)
首先,你不能在排序时消除元素。您必须先对数组进行排序,然后删除重复项。使用Array.prototype.filter
和Array.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;
}
这与Underscore和Prototype的uniq()实现相同。
最后注意:请记住,这只适用于排序数组。
答案 1 :(得分:1)
如果这不是作业,即您不需要自己实施算法,则可以使用sortBy和uniq函数的组合。
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;
}