我必须编写一个函数,它对包含数字和字符串的数组进行排序 例如:
uSort([3,"2", 4,1,"a","c","b"]) // -> ["a","b","c",1,"2",3, 4].
这是我迄今为止所尝试过的:
function uSort(arrayOfChars){
var array = [];
for (i = 0; i < arrayOfChars.length; i++) {
if (typeof(arrayOfChars[i]) === '' ){
array.unshift(arrayOfChars[i]); }
else {
array.push(arrayOfChars[i]);
};
};
return array.sort();
};
但结果是错误的:
uSort([3,"2", 4,1,"a","c","b"]) // -> [1,"2",3, 4,"a","b","c"].
我现在无法弄清楚我的代码有什么问题。
答案 0 :(得分:3)
一种简单的方法是将数组拆分为两个数组,一个包含数字和字符串,数字,使用isNaN
,一个包含其他所有数组,然后对它们进行排序并将它们连接起来一起
function uSort(arrayOfChars){
var numbs = arrayOfChars.filter(function(item) { return isNaN(item) });
var chars = arrayOfChars.filter(function(item) { return !isNaN(item) });
return numbs.sort().concat( chars.sort() );
};
为了更好地排序整数和特殊字符,可以在排序中添加回调
function uSort(arrayOfChars){
var numbs = arrayOfChars.filter(function(item) { return !isNaN(item) });
var chars = arrayOfChars.filter(function(item) { return isNaN(item) });
return chars.sort(function(a, b) {
return a.localeCompare(b);
}).concat( numbs.sort(function(a, b) {
return a == b ? 1 : a - b;
}));
};
答案 1 :(得分:1)
您可以使用自定义比较器函数来检查参数是否为isNaN
的数字,然后使用数字或字典排序:
[3, "2", 4, 1, "a", "c", "b"].sort(function(a,b) {
if(isNaN(a) || isNaN(b)) {
if(!isNaN(a)) return +1; // Place numbers after strings
if(!isNaN(b)) return -1; // Place strings before numbers
return a < b ? -1 : (a > b ? +1 : 0); // Sort strings lexicographically
}
return a - b; // Sort numbers numerically
}); // ["a", "b", "c", 1, "2", 3, 4]
答案 2 :(得分:1)
编写自己的自定义排序方法。
[3,"2", 4,1,"a","c","b"].sort( function (a,b) {
var sa = isNaN(a);
var sb = isNaN(b);
if(sa && sb) { //If both are strings, than compare
return sa>sb;
} else if (!sa && !sb) { //if both are numbers, convert to numbers and compare
return Number(a) - Number(b);
} else { //if we have a number and a string, put the number last.
return sa ? -1 : 1;
}
});
答案 3 :(得分:0)
在字母前加上数字是正常的(如果这是你的问题)。
如果你想在有不同的方式之前收到信件。
一种方法是将元素分为两个数组(一个用于字母,一个用于数字),然后按照您需要的顺序合并它们。
另一种方法是在最后移动数字。
这是一个例子: alert((uSort([3,“2”,4,10,“a”,“c”,“b”])))// - &gt; [“a”,“b”,“c”,1,“2”,3,4]。
function uSort(arrayOfChars){
var arrayNum = [];
var arrayLet = [];
for (i = 0; i < arrayOfChars.length; i++) {
if (typeof(arrayOfChars[i]) === '' ){
array.unshift(arrayOfChars[i]); }
else if (typeof(arrayOfChars[i]) === 'number' ){
arrayNum.push(arrayOfChars[i]);
} else {
arrayLet.push(arrayOfChars[i]);
}
};
if (arrayNum.size!=0 && arrayLet.size!=0) {
arrayNum = arrayNum.sort(sortNumber);
arrayNum.push();
return arrayNum.concat(arrayLet.sort());
} else if (arrayNum.size!=0) {
return arrayNum.sort(sortNumber);
} else {
return arrayLet.sort();
}
};
function sortNumber(a,b) {
return a - b;
}