我想要根据数组,然后按数组中项的长度对数组进行排序。
采用以下主排序数组:
const key = [
"meraki",
"gsuite",
"active directory",
"sophos",
"manageengine"
]我想要一个类似如下的数组:
const raw = [
["manageengine"],
["sophos"],
["active directory"],
["gsuite"],
["meraki"],
["sophos", "manageengine"],
["active directory", "sophos"],
["active directory", "manageengine"],
["gsuite", "active directory"],
["gsuite", "sophos"],
["gsuite", "manageengine"],
["meraki", "gsuite"],
["meraki", "active directory"],
["meraki", "sophos"],
["meraki", "manageengine"],
["active directory", "sophos", "manageengine"],
["gsuite", "active directory", "sophos"],
["gsuite", "active directory", "manageengine"],
["gsuite", "sophos", "manageengine"],
["meraki", "gsuite", "active directory"],
["meraki", "gsuite", "sophos"],
["meraki", "active directory", "sophos"],
["meraki", "gsuite", "manageengine"],
["meraki", "active directory", "manageengine"],
["meraki", "sophos", "manageengine"],
["gsuite", "active directory", "sophos", "manageengine"],
["meraki", "gsuite", "active directory", "sophos"],
["meraki", "gsuite", "active directory", "manageengine"],
["meraki", "gsuite", "sophos", "manageengine"],
["meraki", "active directory", "sophos", "manageengine"],
["meraki", "gsuite", "active directory", "sophos", "manageengine"]
];在上面的示例中,我希望根据key数组中的每一项对raw数组进行排序。我的第一次尝试是这样做的:
const result = [];
for (const name of result) {
const sorted = keys.filter((s) => s[0] === name);
result.push(...sorted);
}
result.sort((a, b) => a.length - b.length);然而,这只考虑了数组中的第一项,而不考虑其余项的排序。
发布于 2020-10-21 00:36:36
要排序,你必须首先检查长度。如果两者相等,我们必须检查a/b的第一个元素在key中的索引位置。如果它们是相同的,则移动到两个数组中的下一个元素。
这个答案利用了0是一个假值这一事实。例如:0 || -1 //=> -1和1 || -1 //=> 1
const key = ["meraki", "active directory", "sophos"];
const raw = [
["meraki"],
["active directory"],
["sophos", "active directory"],
["active directory", "sophos"],
["sophos"],
["meraki", "active directory", "sophos"],
];
raw.sort((a, b) => (
a.length - b.length || a.reduce((diff, _, i) => (
diff || key.indexOf(a[i]) - key.indexOf(b[i])
), 0)
));
console.log(raw);
console.table(raw); // check browser console
发布于 2020-10-21 00:48:47
考虑下面的方法
const key = [
"meraki",
"active directory",
"sophos"
]
const raw = [
["sophos"],
["meraki"],
["active directory"],
["sophos", "active directory"],
["active directory", "sophos"],
["meraki", "active directory", "sophos"]
]
const compareThis = (a, b) => {
if (a.length !== b.length) {
return a.length - b.length
}
let itemFound = 0;
for (let keyIndex in key) {
for (let aIndex in a ) {
if(a[aIndex] === key[keyIndex]) {
itemFound = -1;
break;
}
if(b[aIndex] === key[keyIndex]) {
itemFound = 1;
break;
}
}
if(itemFound !== 0) { break }
}
return itemFound;
}
const sortedData = raw.sort(compareThis)
console.log(sortedData)
https://stackoverflow.com/questions/64448871
复制相似问题