根据两个属性值对对象数组进行排序

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 }
];

我想对我的数组进行排序,以便可以按以下方式对对象进行排序:

通过"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);