You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 05:48:01