Сначала отсортируйте массив, включив идентификатор в другой массив, затем по дате - PullRequest
2 голосов
/ 10 марта 2020
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
  }
];

Чего я хочу добиться:

Я хочу отсортировать массив projects, в котором есть несколько объектов.

Сначала он должен упорядочить объекты, которые сначала включены в linkedProjects по ID.

Во-вторых, он должен упорядочить оставшиеся объекты по 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
  }
]

Ответы [ 2 ]

3 голосов
/ 10 марта 2020

Вы можете взять функцию, которая возвращает либо порядок проектов, либо большое число, и отсортировать по этой дельте или указать дельту последнего обновления.

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; }
1 голос
/ 10 марта 2020

Сначала будет помещено связанное, а затем отсортировано напоминание по lastUpdate

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}];

const sorted = projects.sort(function(a,b){
  if(linkedProjects.indexOf(''+a.id) !== -1) return -1;
  if(linkedProjects.indexOf(''+b.id) !== -1) return 1;
  return b.lastUpdate - a.lastUpdate
});
console.log(sorted);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...