JavaScript实现先按第二个单词排序,相同则按第一个单词排序
解决方法
你只需要在第17行的排序回调函数里补充当第二个单词比较结果为0时,再按第一个单词排序的逻辑就行啦。
修改后的第17行及逻辑说明
原来的排序逻辑只处理了第二个单词的比较,我们可以先计算第二个单词的对比结果,如果结果是0(说明两个字符串的第二个单词完全相同),就再对第一个单词进行localeCompare比较;否则直接返回第二个单词的对比结果。另外,把split的结果存成变量还能避免重复拆分字符串,提升一点效率:
newLinesw.sort(function(a,b){ const aWords = a.split(" "); const bWords = b.split(" "); const secondWordDiff = aWords[1].localeCompare(bWords[1]); // 第二个单词相同时,按第一个单词排序 if (secondWordDiff === 0) { return aWords[0].localeCompare(bWords[0]); } return secondWordDiff; });
完整的修改后代码
var finalLine=[]; function testing() { var logFileSize = 5; var logLines = ["a1 9 2 3 1", "g1 act car", "z04 4 7", "ab1 off key dog", "a8 act zoo" ]; var newLinesw=[]; var newLinesn=[]; var wordsarray=[]; for(var i=0; i< logFileSize; i++) { var words = logLines[i].split(" "); if(isNaN(words[1]) ) newLinesw.push(logLines[i]); else newLinesn.push(logLines[i]); } // 修改后的排序逻辑 newLinesw.sort(function(a,b){ const aWords = a.split(" "); const bWords = b.split(" "); const secondWordDiff = aWords[1].localeCompare(bWords[1]); if (secondWordDiff === 0) { return aWords[0].localeCompare(bWords[0]); } return secondWordDiff; }); for(i=0;i<newLinesw.length;i++){ wordsarray.push(newLinesw[i].split(" ")[1]); } newLinesn.sort(function(a,b){return a.split(" ")[0].localeCompare(b.split(" ")[0]); }); finalLine = newLinesw.concat(newLinesn); return finalLine; } document.getElementById("testing").innerHTML = testing();
这样运行后,newLinesw里的"a8 act zoo"和"g1 act car"会因为第二个单词都是act,转而按第一个单词a8和g1排序,最终a8会排在g1前面,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Anant Gupta
相关产品推荐
相关产品推荐

