根据两个属性值对对象数组进行排序
Sort an array of objects according to two properties values
我有一个对象数组:
let items = [
{ name: 'eric', type: 'comparable', value: 1 },
{ name: 'bob', type: 'comparable', value: 4 },
{ name: 'michael', type: 'comparable', value: 0 },
{ name: 'john', type: 'comparable', value: 3 },
{ name: 'brad', type: 'incomparable', value: null },
{ name: 'james', type: 'incomparable', value: 5},
{ name: 'martin', type: 'comparable', value: 2 },
{ name: 'chris', type: 'comparable', value: null }
];
我想对我的数组进行排序,以便可以按以下方式对对象进行排序:
先按照"type"属性->如果是="Comparable"->按照"value"[=45=排序]
其次,根据"value" 属性 -> 如果为null则放在数组的底部
通过"value"属性,如果为null,则把数组底部的对象做成这样:
{ name: 'michael', type: 'comparable', value: 0 },
{ name: 'eric', type: 'comparable', value: 1 },
{ name: 'martin', type: 'comparable', value: 2 },
{ name: 'john', type: 'comparable', value: 3 },
{ name: 'bob', type: 'comparable', value: 4 },
{ name: 'chris', type: 'comparable', value: null },
{ name: 'brad', type: 'incomparable', value: null },
{ name: 'james', type: 'incomparable', value: 5}
我已经这样做了:
items.sort((a, b) => {
return (a.value===null)-(b.value===null) || +(a.value>b.value)||-(a.ordre<b);
});
但是我总是根据 "value" 属性 排序,我希望它首先查找 属性
(我不会用loadash)
建议 ?
我个人认为如果逻辑读起来与您描述的方式相似,则更容易阅读。在此示例中,我尝试将您描述的要求放入一系列 if
语句而不是单个逻辑表达式中:
let items = [
{ name: 'eric', type: 'comparable', value: 1 },
{ name: 'bob', type: 'comparable', value: 4 },
{ name: 'michael', type: 'comparable', value: 0 },
{ name: 'john', type: 'comparable', value: 3 },
{ name: 'brad', type: 'incomparable', value: null },
{ name: 'james', type: 'incomparable', value: 5},
{ name: 'martin', type: 'comparable', value: 2 },
{ name: 'chris', type: 'comparable', value: null }
];
console.log(items.sort((a, b) => {
if (a.type === 'comparable' && b.type === 'comparable') {
if (a.value == null) return 1;
return a.value - b.value;
}
if (a.type === 'comparable') return -1;
return 1;
}));
您可以对 type
执行 localeCompare
,然后在类型相同的情况下执行布尔短路。在表达式的第二部分,您可以计算 value
,将 null
强制转换为 Infinity
以将其移动到末尾。
const items = [
{ name: 'eric', type: 'comparable', value: 1 },
{ name: 'bob', type: 'comparable', value: 4 },
{ name: 'michael', type: 'comparable', value: 0 },
{ name: 'john', type: 'comparable', value: 3 },
{ name: 'brad', type: 'incomparable', value: null },
{ name: 'james', type: 'incomparable', value: 5},
{ name: 'martin', type: 'comparable', value: 2 },
{ name: 'chris', type: 'comparable', value: null }
];
items.sort((a, b) => a.type.localeCompare(b.type)
|| (a.value != null ? a.value : Infinity) - (b.value != null ? b.value : Infinity));
console.log(items);
我有一个对象数组:
let items = [
{ name: 'eric', type: 'comparable', value: 1 },
{ name: 'bob', type: 'comparable', value: 4 },
{ name: 'michael', type: 'comparable', value: 0 },
{ name: 'john', type: 'comparable', value: 3 },
{ name: 'brad', type: 'incomparable', value: null },
{ name: 'james', type: 'incomparable', value: 5},
{ name: 'martin', type: 'comparable', value: 2 },
{ name: 'chris', type: 'comparable', value: null }
];
我想对我的数组进行排序,以便可以按以下方式对对象进行排序:
先按照"type"属性->如果是="Comparable"->按照"value"[=45=排序]
其次,根据"value" 属性 -> 如果为null则放在数组的底部
通过"value"属性,如果为null,则把数组底部的对象做成这样:
{ name: 'michael', type: 'comparable', value: 0 },
{ name: 'eric', type: 'comparable', value: 1 },
{ name: 'martin', type: 'comparable', value: 2 },
{ name: 'john', type: 'comparable', value: 3 },
{ name: 'bob', type: 'comparable', value: 4 },
{ name: 'chris', type: 'comparable', value: null },
{ name: 'brad', type: 'incomparable', value: null },
{ name: 'james', type: 'incomparable', value: 5}
我已经这样做了:
items.sort((a, b) => {
return (a.value===null)-(b.value===null) || +(a.value>b.value)||-(a.ordre<b);
});
但是我总是根据 "value" 属性 排序,我希望它首先查找 属性
(我不会用loadash)
建议 ?
我个人认为如果逻辑读起来与您描述的方式相似,则更容易阅读。在此示例中,我尝试将您描述的要求放入一系列 if
语句而不是单个逻辑表达式中:
let items = [
{ name: 'eric', type: 'comparable', value: 1 },
{ name: 'bob', type: 'comparable', value: 4 },
{ name: 'michael', type: 'comparable', value: 0 },
{ name: 'john', type: 'comparable', value: 3 },
{ name: 'brad', type: 'incomparable', value: null },
{ name: 'james', type: 'incomparable', value: 5},
{ name: 'martin', type: 'comparable', value: 2 },
{ name: 'chris', type: 'comparable', value: null }
];
console.log(items.sort((a, b) => {
if (a.type === 'comparable' && b.type === 'comparable') {
if (a.value == null) return 1;
return a.value - b.value;
}
if (a.type === 'comparable') return -1;
return 1;
}));
您可以对 type
执行 localeCompare
,然后在类型相同的情况下执行布尔短路。在表达式的第二部分,您可以计算 value
,将 null
强制转换为 Infinity
以将其移动到末尾。
const items = [
{ name: 'eric', type: 'comparable', value: 1 },
{ name: 'bob', type: 'comparable', value: 4 },
{ name: 'michael', type: 'comparable', value: 0 },
{ name: 'john', type: 'comparable', value: 3 },
{ name: 'brad', type: 'incomparable', value: null },
{ name: 'james', type: 'incomparable', value: 5},
{ name: 'martin', type: 'comparable', value: 2 },
{ name: 'chris', type: 'comparable', value: null }
];
items.sort((a, b) => a.type.localeCompare(b.type)
|| (a.value != null ? a.value : Infinity) - (b.value != null ? b.value : Infinity));
console.log(items);