【问题标题】:Array.sort does not reorder array with NaN values in objectArray.sort 不会对对象中具有 NaN 值的数组重新排序
【发布时间】:2019-03-30 22:36:45
【问题描述】:

我有一个简单的案例,通过其中每个 object 的 prop minLVL 对数组中的项目进行重新排序。

但由于某种原因,它仅在存在前一个和下一个道具时才有效(如您所见,并非每个 object 都需要 minLVL 字段)。因此,如果某个对象中缺少minLVL,它不会将此类项目重新编码到列表的底部,而是保持在相同的位置。

我该如何解决?谢谢

例子:

 var h = [
        {
            ID: 172
    	},
        {
            ID: 179,
            minLVL: "30"
    	},
        {
            ID: 169
    	},
        {
            ID: 173
    	},
        {
            ID: 167,
            minLVL: "25"
    	},
        {
    		ID: 175,
            minLVL: "10"
    	}
    ]
    
          var n = h.sort((a, b) => Number(b.minLVL) - Number(a.minLVL))
    
    console.log(n)

【问题讨论】:

    标签: javascript arrays sorting


    【解决方案1】:

    如果 sort 函数中不存在这些值,您可以将这些值默认为 0

    var h = [{
      ID: 172
    }, {
      ID: 179,
      minCrimeLevel: "30"
    }, {
      ID: 169
    }, {
      ID: 173
    }, {
      ID: 167,
      minCrimeLevel: "25"
    }, {
      ID: 175,
      minCrimeLevel: "10"
    }]
    
    var n = h.sort((a, b) => (Number(b.minCrimeLevel) || 0) - (Number(a.minCrimeLevel)|| 0))
    
    console.log(n)

    【讨论】:

    • 谢谢。是的,我知道。但这会损害性能......为什么 JS 不会像 undefined 值那样“在后台”进行这样的计算?
    • @MaxTravis 因为NaN 是一个特殊值 - NaN > 0NaN < 0NaN == 0 都被评估为 false 因为NaN (有点自相矛盾)一个数字,但表示一个......不是数字的值。 undefinednot 类型的数字,因此它被强制为一个。 NaN 没有什么可以强迫的。
    • 同意@vlaz。检查你是否使用了Number()函数
    • 但如果你的值为零,那么这将失败。您需要明确检查 isNaN 或更好地检查 minCrimeLevel 是否在对象中,然后将大的负数作为值,例如 -Infinity
    猜你喜欢
    • 2018-08-26
    • 2017-04-12
    • 2018-08-31
    • 2021-08-22
    • 1970-01-01
    • 2022-06-10
    • 2021-02-15
    • 2021-08-22
    • 1970-01-01
    相关资源
    最近更新 更多