首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组的JavaScript排序数组

数组的JavaScript排序数组
EN

Stack Overflow用户
提问于 2020-10-20 23:54:54
回答 2查看 104关注 0票数 0

我想要根据数组,然后按数组中项的长度对数组进行排序。

采用以下主排序数组:

代码语言:javascript
复制
const key = [
  "meraki",
  "gsuite",
  "active directory",
  "sophos",
  "manageengine"
]

我想要一个类似如下的数组:

代码语言:javascript
复制
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数组进行排序。我的第一次尝试是这样做的:

代码语言:javascript
复制
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);

然而,这只考虑了数组中的第一项,而不考虑其余项的排序。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-21 00:36:36

要排序,你必须首先检查长度。如果两者相等,我们必须检查a/b的第一个元素在key中的索引位置。如果它们是相同的,则移动到两个数组中的下一个元素。

这个答案利用了0是一个假值这一事实。例如:0 || -1 //=> -11 || -1 //=> 1

代码语言:javascript
复制
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

票数 1
EN

Stack Overflow用户

发布于 2020-10-21 00:48:47

考虑下面的方法

代码语言:javascript
复制
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)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64448871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档