Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays .sort()与多个文本和数字数组的行为异常_Arrays_Sorting_Ecmascript 6_Concatenation - Fatal编程技术网

Arrays .sort()与多个文本和数字数组的行为异常

Arrays .sort()与多个文本和数字数组的行为异常,arrays,sorting,ecmascript-6,concatenation,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,

我一直在处理.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,4,10]; //返回1,10,2,3,4,5,6,7,8,9 document.write(多数组[0] .concat(多数组[1]) .sort() +“
”; //返回1,2,3,4,5,6,7,8,9,10 document.write(多数组[0] .concat(多数组[1]) .排序((a,b)=>a-b) +“
”; 和文本

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/>"); 
var multiArray=[[2,8,1,7,9],[6,3,5,“text”,4,10];
//返回1,2,3,4,5,6,text,7,8,9,10
document.write(多数组[0]
.concat(多数组[1])
.排序((a,b)=>a-b)
+“
”;
没有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/>"); 
var multiArray=[[2,8,1,7,9],[6,5,“text”,4,10];
//返回1,2,5,6,7,8,9,文本,4,10
document.write(多数组[0]
.concat(多数组[1])
.排序((a,b)=>a-b)
+“
”;
首先,将所有阵列合并到一个阵列中

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

您希望
a-b
对字符串做什么?
.sort()
不进行数字排序。您必须向它传递一个自定义排序回调来执行数字排序。这就解释了你的第一个结果。你的第二个和第三个结果是数字和文本的混合结果,但你使用的比较函数在数字和文本方面并不聪明。垃圾进来,垃圾出去。当你给它一个字符串和一个数字时,你的a-b最终会尝试进行类型强制,这只会给你一个无意义的结果。如果要混合文本和数字,则需要一个比较函数来检测混合类型之间的比较,并准确实现在这种情况下比较算法的工作方式。仅供参考,本问题中的
.concat()
与任何内容都无关。如果你从平面数组开始,跳过
.concat()
部分,问题也是一样的。谢谢,这很有意义。我对.sort((a,b)=>a-b)的工作原理有点困惑,但现在我明白了。我必须假设它会将文本转换为unicode或二进制,并以这种方式排序。