【问题标题】:Function sort an array with JavaScript函数使用 JavaScript 对数组进行排序
【发布时间】:2015-10-11 13:20:06
【问题描述】:

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

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

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

【问题讨论】:

  • 那么数字前的字符串?
  • 那是正确的 adeneo。
  • typeof 永远不会返回''
  • 您不应该取消筛选您正在排序的数组,将它们移到末尾将使您在排序时产生零差异。
  • 您需要编写自己的自定义排序方法。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

标签: javascript arrays string sorting numbers


【解决方案1】:

一种简单的方法是将数组拆分为两个数组,一个包含数字和数字字符串,使用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

【讨论】:

  • 你仍然需要实现更好的数字排序,在任何地方添加一个 10,它看起来像这样["a", "b", "c", 1, 10, "2", 3, 4]
  • 字符串数字应该在数字之后 ["a","b","c",1,"1",2,"2","2",3,"3" ],而是得到:["a","b","c","1",1,"2",2,"2",3,"3"]
  • @epascarello - 至少它不会像你的那样返回 ["a", "c", "b", ...] 吗?
  • @Dennis - 也修改了最后一个。
【解决方案2】:

您可以使用自定义比较器函数,通过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]

【讨论】:

    【解决方案3】:

    编写您自己的自定义排序方法。

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

    【讨论】:

    • 另外,如果两者都不是 NaN,则不需要显式转换为 Number。
    • 应该是&gt;@Oriol
    【解决方案4】:

    字母前有数字是正常的(如果这是您的问题)。

    如果你想有字母之前你有不同的方式。

    一种方法是将元素排序到两个数组中(一个用于字母,一个用于数字),然后按您需要的顺序合并它们。

    另一种方法是移动末尾的数字。

    这是一个例子: alert((uSort([3,"2", 4,10,"a","c","b"]))) // -> ["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;
    }
    

    【讨论】:

    • 没错,但从技术上讲,"2" 不是数字,因此您还必须添加类型转换
    • 是的,这就是为什么我使用 array.unshift 将数字放在最后,但它仍然不起作用。
    • 没有理由这样做,添加两个数组不会产生数组。这是完全错误的
    • 这不起作用。例如uSort([3,"2", 4,1, 10,"a","c","b"]) 返回1,10,3,42,a,b,c
    • 最后一行是错误的(创建一个字符串)......顺便说一句,另一个是正确的......你只需要使用 concat()
    猜你喜欢
    • 2018-10-19
    • 1970-01-01
    • 2011-12-09
    • 2022-11-02
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多