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

函数使用JavaScript对数组进行排序,javascript,arrays,string,sorting,numbers,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

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

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,10,“a”,“c”,“b”]))/->[“a”,“b”,“c”,1,“2”,3,4]

函数uSort(arrayOfChars){
var arrayNum=[];
var arrayLet=[];
对于(i=0;i
字母前有数字是正常的(如果这是您的问题)

如果你想在有不同的方式之前先有信

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

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

这是一个例子: 警报((uSort([3,“2”,4,10,“a”,“c”,“b”]))/->[“a”,“b”,“c”,1,“2”,3,4]

函数uSort(arrayOfChars){
var arrayNum=[];
var arrayLet=[];
对于(i=0;i
一种简单的方法是将数组拆分为两个数组,一个包含数字和字符串(使用
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;
    }));
};

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

您可以使用自定义比较器函数,该函数使用
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,“2”,4,1,“a”,“c”,“b”]排序(函数(a,b){
if(isNaN(a)| | isNaN(b)){
如果(!isNaN(a))返回+1;//将数字放在字符串后面
if(!isNaN(b))返回-1;//将字符串放在数字之前
返回ab?+1:0);//按字典顺序对字符串排序
}
返回a-b;//对数字进行数字排序
}); // [“a”、“b”、“c”、“1”、“2”、“3、4]

您可以使用自定义比较器函数,该函数使用
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,“2”,4,1,“a”,“c”,“b”]排序(函数(a,b){
if(isNaN(a)| | isNaN(b)){
如果(!isNaN(a))返回+1;//将数字放在字符串后面
if(!isNaN(b))返回-1;//将字符串放在数字之前
返回ab?+1:0);//按字典顺序对字符串排序
}
返回a-b;//对数字进行数字排序
}); // [“a”、“b”、“c”、“1”、“2”、“3、4]

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

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


那么数字之前的字符串呢?没错。
typeof
将永远不会返回
'
。您不应该取消正在排序的数组的升序,将它们移到末尾将在排序之后产生零差异。您需要编写自己的自定义排序方法。那么数字之前的字符串呢?没错。
typeof
将永远不会返回
'
。您不应该取消正在排序的数组的升序,将它们移到末尾将在排序之后产生零差异。您需要编写自己的自定义排序方法。是的,但从技术上讲,
“2”
不是一个数字,因此您还必须添加类型转换是的,这就是我使用array.unshift将数字放在末尾的原因,但它仍然不起作用。没有理由这样做,而且添加两个数组不会生成一个数组。这是完全错误的,这不起作用。在示例
uSort([3,“2”,4,1,10,“a”,“c”,“b”])
返回
1,10,3,42,a,b,c
仅最后一行(创建字符串)是错误的。。。顺便说一句,另一个是正确的。。。您只需要使用concat()True,但从技术上讲,
“2”
不是一个数字,因此您还必须添加类型转换是的,这就是我使用array.unshift将数字放在末尾的原因,但它仍然不起作用。没有理由这样做,添加两个数组也不会生成数组。这是完全错误的,这不起作用。