Arrays .sort()与多个文本和数字数组的行为异常
我一直在处理.sort()和.concat()函数,试图将多个数字和文本数组组合成一个数组,并按时间顺序排列。如果只向数组中输入数字,它似乎可以正常工作,但一旦有文本,它似乎会随机放置,在本例中,是在6到7之间。另外,如果我从数组中删除数字3,则数字4在文本后的顺序会发生变化,两者都在9和10之间。如果有人能帮忙,我不知道它为什么要这样做 只有数字: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,
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或二进制,并以这种方式排序。