函数使用JavaScript对数组进行排序

时间:2015-10-11 13:20:06

标签: javascript arrays string sorting numbers

我必须编写一个函数,它对包含数字和字符串的数组进行排序 例如:

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"].

我现在无法弄清楚我的代码有什么问题。

4 个答案:

答案 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() );
};

FIDDLE

为了更好地排序整数和特殊字符,可以在排序中添加回调

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;
    }));
};

FIDDLE

答案 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;
}