JavaScript嵌套对象数组按国家排序及内部分数升序输出undefined问题
问题原因分析
- 第一个问题:
forEach方法没有返回值Array.prototype.forEach()仅用来遍历数组执行回调逻辑,本身返回undefined,你将它的返回值赋值给orderedScores变量,自然打印结果就是undefined。另外sort方法是原地排序,会直接修改原数组,你对国家排序后遍历修改每个国家的scores数组,也是直接修改原对象属性,不需要额外接收返回值。 - 第二个问题:分数排序的比较函数逻辑有问题
首先sort方法的比较函数需要返回负数、0、正数三种结果,你返回a.s > b.s布尔值,会被隐式转换为1或0,缺少负数的情况,会导致排序结果不符合预期。其次你的数组中存在字符串类型的分数(比如示例里lucy的s为字符串"4134234"),直接比较会按字符串字典序判断大小,不是按照数值大小排序。
修正后的代码
//Structure of the Array let allCountryScores=[ { name: "Ethiopia", scores: [ {n: "Sub", s: 9990}, {n: "lucy", s: "4134234"}, {n: "DWH", s: 9999}, {n: "Hanif", s: 999999999} ] }, ] // 先拷贝原数组再做国家字母序排序,避免修改原数组 let orderedCountries = [...allCountryScores].sort((a, b) => a.name.localeCompare(b.name)); // 遍历每个国家完成内部分数升序排序 orderedCountries.forEach(country => { // 把分数转成数字后做差,得到正确的数值比较结果 country.scores.sort((a, b) => Number(a.s) - Number(b.s)) }); // 直接打印排序后的结果即可 console.log(orderedCountries);
内容的提问来源于stack exchange,提问作者Kudah Shambare
相关产品推荐
相关产品推荐

