如果我有以下数组:
[0, 1, 3, 0, 4, 2]
我想对它进行升序排序,除了末尾需要的零:
[1, 2, 3, 4, 0, 0]
请记住,对于这个解决方案,我没有访问下划线或linq.js。我目前的解决方案可以工作,但感觉相当沉重、冗长,而且不是很优雅。下面是我的代码:
function sortNumbers(numbers) {
var zeroNumbers = [];
var notZeroNumbers = [];
for (var i = 0; i < numbers.length; i++) {
if (numbers[i] === 0) {
zeroNumbers.push(numbers[i]);
} else {
notZeroNumbers.push(numbers[i]);
}
}
var sortedNumbers = notZeroNumbers.sort(function (a, b) {
return parseFloat(a) - parseFloat(b);
});
for (var x = 0; x < zeroNumbers.length; x++) {
sortedNumbers.push(zeroNumbers[x]);
}
return sortedNumbers;
}
我可以改进这个解决方案吗?
这与这个问题无关,但我正在搜索"纯排序javascript",这是第一个答案。
因为sort会改变原始数组,所以排序数组时的最佳实践是先克隆它。
const sortedArray = [...array].sort(/* optional comparison function*/)
simple try
var output = [0, 1, 3, 0, 4, 2].sort(function(a, b) {
a = a || Number.MAX_SAFE_INTEGER; //if a == 0 then it will be a falsey value and a will be assigned Number.MAX_SAFE_INTEGER
b = b || Number.MAX_SAFE_INTEGER;
return a - b;
});
console.log(output)
var arr = [0, 1, 3, 0, 4, 2, 9, 8, 7, 0];
arr.sort(function (left, right) {
return left == right ? 0 : (left === 0 ? 1 : (left < right ? -1 : 1));
});
console.log(arr)
无论数字的大小,这将始终在末尾放置0。
使用Array.sort
, Array.splice
和Array.push
函数的另一种替代方案:
var arr = [0, 1, 3, 0, 4, 2];
arr.sort();
while(arr[0] === 0) { arr.splice(0,1); arr.push(0); }
console.log(arr); // [1, 2, 3, 4, 0, 0]
您可以使用sort,它接受闭包/回调。
var sortedArray = [0, 1, 3, 0, 4, 2].sort(function(currentValue, nextValue) {
if(currentValue === 0) {
return 1;
} else {
return currentValue - nextValue;
}
});