.sort()奇怪地处理了多个文本和数字数组

时间:2018-06-19 19:44:25

标签: arrays sorting ecmascript-6 concatenation

我一直在纠结.sort()和.concat()函数,试图将多个数字和文本数组组合为一个并按时间顺序对其进行排序。如果仅将数字输入到数组中,则似乎工作正常,但是一旦有文本,它似乎将其随机放置(在这种情况下,介于6和7之间)。此外,如果我从数组中删除数字3,则数字4文本之后的结尾顺序都乱七八糟,都在9到10之间。我不知道为什么如果有人可以帮助,为什么这样做。

仅包含数字

var multiArray = [[2, 8, 1, 7, 9], [6, 3, 5, 4, 10]];

// returns 1,10,2,3,4,5,6,7,8,9
document.write(multiArray[0]
           .concat(multiArray[1])
           .sort() 
           +"<br/>");

 // returns 1,2,3,4,5,6,7,8,9,10
document.write(multiArray[0]
               .concat(multiArray[1])
               .sort((a,b)=>a-b) 
               +"<br/>"); 

并带有文字

var multiArray = [[2, 8, 1, 7, 9], [6, 3, 5, "text", 4, 10]];

// returns 1,2,3,4,5,6,text,7,8,9,10
document.write(multiArray[0]
               .concat(multiArray[1])
               .sort((a,b)=>a-b) 
               +"<br/>"); 

不包含3

var multiArray = [[2, 8, 1, 7, 9], [6, 5, "text", 4, 10]];

// returns 1,2,5,6,7,8,9,text,4,10
document.write(multiArray[0]
               .concat(multiArray[1])
               .sort((a,b)=>a-b) 
               +"<br/>"); 

1 个答案:

答案 0 :(得分:0)

首先,将所有数组合并为一个数组

var multiArray = [[2, 8, 1, 'foo', 7, '1', 9], [6, 5, 'text', 4, 'bar', 10]];
var flattenArray = [].concat(...multiArray);        // [ 2, 8, 1, 'foo', 7, '1', 9, 6, 5, 'text', 4, 'bar', 10 ]

然后分别对数字和字符串进行排序

const sortedNumbers = flattenArray
    .filter(n => typeof n === 'number')
    .sort((a, b) => a - b);

const sortedStrings = flattenArray
    .filter(n => typeof n === 'string')
    .sort();

最后,同时连接两个

const sorted = sortedNumbers.concat(sortedStrings);     // [ 1, 2, 4, 5, 6, 7, 8, 9, 10, '1', 'bar', 'foo', 'text' ]

我假设您要在数字后面输入字符串。否则,只需反转连接:

const sorted = sortedStrings.concat(sortedNumbers);