按特定顺序对对象 keys/entries 进行排序

Sort object keys/entries in specific order

我有一个这样的对象:

const data = {
  val5: 1231,
  val3: 1232,
  val1: 1233,
  val2: 1234,
  val4: 1235,
};

它必须按 it 键排序,但要按特定顺序:

const sortOrder = ["val1", "val3", "val2"];

如果 sortOrder 中不存在密钥,则它必须低于存在的密钥。并且不存在的键顺序应该(可能)保持不变。

结果对象应如下所示:

{
  val1: 1233, // present in sortOrder at position 0
  val3: 1232, // present in sortOrder at position 1
  val2: 1234, // present in sortOrder at position 2
  val5: 1231, // NOT present in sortOrder
  val4: 1235, // NOT present in sortOrder
}

我现在一直在尝试对键进行排序,并且可以实现一些顺序,但不存在的键出现在顶部

const ordered = Object.keys(data).sort((a, b) => {
  return sortOrder.indexOf(a) - sortOrder.indexOf(b);
});
[ 'val5', 'val4', 'val1', 'val3', 'val2' ]

如您所见,val5val4 是开头,它们应该在结尾(在 val2 之后)

您几乎搞定了,唯一的问题是您没有检查 sortOrder 是否确实包含您正在迭代的密钥。

如果你sortOrder.indexOf(x)x不在sortOrder,那么indexOf将return-1,解释了为什么 non-existent 键总是在最上面 (--1 === +1)。有关详细信息,请参阅 reference

修复方法是 手动sortOrder 中不存在的所有键放在数组的末尾:

if (!sortOrder.includes(a)) return 1 
if (!sortOrder.includes(b)) return -1

所以最后,你会得到这个:

const ordered = Object.keys(data).sort((a, b) => {
  if (!sortOrder.includes(a)) return 1 
  if (!sortOrder.includes(b)) return -1
  return sortOrder.indexOf(a) - sortOrder.indexOf(b);
});