javascript - 首先通过在其他数组中包含 ID 对数组进行排序,然后按日期排序

标签 javascript arrays sorting object

const linkedProjects = ["2", "3"];
const projects = [
  {
    id: 1,
    name: "Project 1",
    lastUpdate: 1575976301091
  },
  {
    id: 2,
    name: "Project 2",
    lastUpdate: 1575975812091
  },
  {
    id: 3,
    name: "Project 3",
    lastUpdate: 1575976378391
  },
  {
    id: 4,
    name: "Project 4",
    lastUpdate: 15753276301091
  }
];

我想要实现的目标:

我想对包含多个对象的数组项目进行排序。

首先,它应该首先按 ID 对包含在 linkedProjects 中的对象进行排序。

其次,它应该按 lastUpdate 对剩余对象进行排序。

到目前为止我做了什么:

projects.sort((a, b) => {
    const [dateA, dateB] = [
        a.lastUpdate && a.lastUpdate.getTime(),
        b.lastUpdate && b.lastUpdate.getTime()
    ];
    if (linkedProjects && linkedProjects.length > 0) {
      if (linkedProjects.includes(a.id)) {
        return -1;
      } else {
        return 1;
      }
    }
    if (dateA === dateB) {
        console.log("0a")
        return 0;
    }
    if (!dateA) {
      console.log("1b")
        return 1;
    }
    if (!dateB) {
        console.log("-1b")
        return -1;
    }
    if (dateA > dateB) {
        console.log("-1d")
        return -1;
    }
    if (dateA < dateB) {
        console.log("1")
        return 1;
    }
    return 0;
})

按lastUpdate排序可以工作并且之前已实现,但我使用linkedProjects的新实现不起作用。

结果应该是:

[
  {
    id: 2, // included in linkedProjects
    name: "Project 2",
    lastUpdate: 1575975812091
  },
  {
    id: 3, // included in linkedProjects
    name: "Project 3",
    lastUpdate: 1575976378391
  },
  {
    id: 4,
    name: "Project 4",
    lastUpdate: 15753276301091 // is newer than Project 1
  },
  {
    id: 1,
    name: "Project 1",
    lastUpdate: 1575976301091 // is older than Project 4
  }
]

最佳答案

您可以采用一个返回项目顺序或一个大数字的函数,并按此增量或上次更新的增量进行排序。

const
    linkedProjects = [2, 3],
    getOrder = ({ id }) => (linkedProjects.indexOf(id) + 1) || Number.MAX_VALUE,
    projects = [{ id: 1, name: "Project 1", lastUpdate: 1575976301091 }, { id: 2, name: "Project 2", lastUpdate: 1575975812091 }, { id: 3, name: "Project 3", lastUpdate: 1575976378391 }, { id: 4, name: "Project 4", lastUpdate: 15753276301091 }];

projects.sort((a, b) => getOrder(a) - getOrder(b) || b.lastUpdate - a.lastUpdate);

console.log(projects);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 首先通过在其他数组中包含 ID 对数组进行排序,然后按日期排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60621691/

相关文章:

javascript - 为某些特定类别的新系列添加积分

c# - C#中如何删除数组中的元素

python - 从一个数组中删除另一个数组中的所有数字

PHP 从多维数组创建多个表

java - 二叉搜索树排序时出现问题

javascript - 如何修复 JavaScript 插件仅适用于每隔一个部分页面 ajax 加载

c# - 每次访问更改背景图像

javascript - 如何在javascript中的迭代器生成器中实现递归遍历?

c++ - 如何对 QMap<QString, myStruct> 进行排序?

javascript - 根据宽度/大小对多个 Flexbox 行中的元素进行排序