我有一个包含字符串和数值的对象数组。需要一种自然的排序来处理组合值。 例如:
输入数组:
[
{
key1: '156557_08_315F036D',
key2: 30,
key3: 's' },
{
key1: '156557_08_315F036D',
key2: 10,
key3: 'm' },
{
key1: '156557_08_315F036D',
key2: 10,
key3: 's' },
{
key1: '156557_08_315F036D',
key2: 15,
key3: 's' },
{
key1: '156557_08_315F036D',
key2: 20,
key3: 's' }
]
这应该按照key3 + key1 + key2格式的升序排序,其中只有key2是数字,并且想要自然排序..不作为字符串。
输出将是:
[
{
key1: '156557_08_315F036D',
key2: 10,
key3: 'm' },
{
key1: '156557_08_315F036D',
key2: 10,
key3: 's' },
{
key1: '156557_08_315F036D',
key2: 15,
key3: 's' },
{
key1: '156557_08_315F036D',
key2: 20,
key3: 's' },
{
key1: '156557_08_315F036D',
key2: 30,
key3: 's' }
]
arr.sort(function (a, b) {
return (
a.key3 + a.key1 + parseInt(a.key2) >
b.key3 + b.key1 + parseInt(b.key2) ?
1 :
((b.key3 + b.key1 + parseInt(b.key2) >
a.key3 + a.key1 + parseInt(a.key2)) ?
-1 : 0));
});
尝试了key2的字符串,但是进行了字符串排序。
答案 0 :(得分:1)
如果你不介意额外的依赖,这里有一个名为thenBy
的酷库:
// first by length of name, then by population, then by ID
data.sort(
firstBy(function (v) { return v.name.length; })
.thenBy("population")
.thenBy("id")
);
这可以通过使用函数或对象属性的键名进行排序。
答案 1 :(得分:0)
我误读了你的问题,你可以使用===运算符。这不会自动转换类型,如' =='运营商。我不确定你要做什么,看起来你希望排序标准基于某些属性顺序。如果是这样,下面的代码就可以了。
function compareFunction(obj1,obj2){
var ord = ['key3','key1','key2']; //Specify order here
for(var i =0;i<ord.length;i++){
if(obj1[ord[i]] === obj2[ord[i]]){
continue;
}
else{
if(obj1[ord[i]] < obj2[ord[i]]){
return -1;
}
if(obj1[ord[i]] > obj2[ord[i]]){
return 1;
}
}
}
return 0;
}
然后只需调用arr.sort(compareFunction);
答案 2 :(得分:0)
我用了Lodash:
const sorted = _.orderBy(arr, ['key3', 'key1', 'key2'], ['asc', 'asc', 'asc']);
太棒了!