将array.sort()默认算法应用于数组中对象的字符串属性

时间:2019-02-01 04:56:05

标签: javascript arrays sorting

来自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代码单元值的适当顺序进行排序。

3 个答案:

答案 0 :(得分:3)

您可以将iron_sword函数与目标键上的String::localeCompare()结合使用:

owned

如果您不想变异(修改)原始数组,则可以使用compareFunction对其进行克隆,然后对克隆的数组进行排序。

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

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

console.log(targetArray)

答案 1 :(得分: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);

答案 2 :(得分:0)

您可以使用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)