按特定顺序对对象 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' ]
如您所见,val5
和 val4
是开头,它们应该在结尾(在 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);
});
我有一个这样的对象:
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' ]
如您所见,val5
和 val4
是开头,它们应该在结尾(在 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);
});