【问题标题】:Apply array.sort() default algorithm to string properties of objects in an array [duplicate]将array.sort()默认算法应用于数组中对象的字符串属性[重复]
【发布时间】:2019-06-25 15:40:59
【问题描述】:

来自Array.prototype.sort()documentation

默认排序顺序建立在将元素转换为 字符串,然后比较它们的 UTF-16 代码单元值序列。

如果目标数组的元素是对象并且我们想将上述算法应用于targetKey 的值怎么办?

const targetArray = [
    { targetKey: 'March' },
    { targetKey: 'Jan' },
    { targetKey: 'Feb' },
    { targetKey: 'Dec' }
]

预期结果:

[
    { targetKey: 'Dec' },
    { targetKey: 'Feb' },
    { targetKey: 'Jan' },
    { targetKey: 'March' }
]

一些简单的解决方案?

警告:我们不考虑在这个问题中按字母排序。我们需要订购 UTF-16 代码单元值的应有序列。

【问题讨论】:

标签: javascript arrays sorting


【解决方案1】:

您可以在目标键上使用compareFunction 函数和String::localeCompare()

const targetArray = [
    { targetKey: 'March' },
    { targetKey: 'Jan' },
    { targetKey: 'Feb' },
    { targetKey: 'Dec' }
];

targetArray.sort((a, b) => a.targetKey.localeCompare(b.targetKey));

console.log(targetArray)

如果你不想改变(修改)原始数组,你可以用slice()克隆它,然后对克隆的数组进行排序。

const targetArray = [
    { targetKey: 'March' },
    { targetKey: 'Jan' },
    { targetKey: 'Feb' },
    { targetKey: 'Dec' }
];

let res = targetArray.slice(0).sort((a, b) => a.targetKey.localeCompare(b.targetKey));

console.log(targetArray)
console.log(res);

【讨论】:

    【解决方案2】:

    您也可以使用destructing assingment 获取targetKey,然后使用.localeCompare 比较两个值:

    const targetArray = [
        { targetKey: 'March' },
        { targetKey: 'Jan' },
        { targetKey: 'Feb' },
        { targetKey: 'Dec' }
    ],
    
    res = targetArray.sort(({targetKey:a}, {targetKey:b}) => a.localeCompare(b));
    console.log(res);

    【讨论】:

      【解决方案3】:

      您可以使用Intl.collator

      const targetArray = [
          { targetKey: 'March' },
          { targetKey: 'Jan' },
          { targetKey: 'Feb' },
          { targetKey: 'Dec' }
      ];
      
      let op = targetArray.sort(({targetKey:a},{targetKey:b})=>new Intl.Collator('en').compare(a,b));
      
      console.log(op)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-30
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 2017-02-16
        • 2018-02-06
        • 1970-01-01
        • 2019-05-11
        相关资源
        最近更新 更多