сортировать больший массив javascript по другому массиву и перемещать значения в верхнюю часть массива - PullRequest
0 голосов
/ 22 сентября 2018

Я прошу прощения, если об этом уже спрашивали, но я искал сортировку массива javascript на основе критериев другого массива.Я знаю, что все значения, содержащиеся в массиве критериев, будут где-то в большем массиве, но мне нужно, чтобы значения из массива критериев были перемещены в верхнюю часть списка.

Например, у меня есть большой массив, который выглядит примерно так:

array = [
  {_id: "123", username: "username1",platform: "xbox"},
  {_id: "124", username: "username2",platform: "xbox"},
  {_id: "125", username: "username3",platform: "ps4"},
  {_id: "126", username: "username4",platform: "pc"},
  {_id: "127", username: "username5",platform: "ps4"},
  {_id: "128", username: "username6",platform: "pc"}
    ];

Затем мне нужно отсортировать этот больший массив на основе критериев меньшего массива, а затем переместить эти значения ввершина большего

Так что в этом случае массив критериев будет

critarray = [
 {_id: "124", username: "username2",platform: "xbox"},
 {_id: "127", username: "username5",platform: "ps4"},
 {_id: "128", username: "username6",platform: "pc"},
];

Массив большего размера будет отсортирован следующим образом:

array = [
  {_id: "124", username: "username2",platform: "xbox"},
  {_id: "127", username: "username5",platform: "ps4"},
  {_id: "128", username: "username6",platform: "pc"},
  {_id: "123", username: "username1",platform: "xbox"},
  {_id: "125", username: "username3",platform: "ps4"},
  {_id: "126", username: "username4",platform: "pc"},
    ];

Такжепорядок не имеет значения, если все объекты в массиве критериев перемещены наверх.

Любая помощь будет принята с благодарностью!

Спасибо

1 Ответ

0 голосов
/ 22 сентября 2018

Фильтр и конкат

Поскольку вам не важен порядок, отличный от этих двух групп, и вы знаете, что в большем массиве все элементы из меньшего, а не из сортировки,Вы можете просто отфильтровать все critarray элементов из array, чем объединить critarray и array:

let array = [
    {_id: "123", username: "username1",platform: "xbox"},
    {_id: "124", username: "username2",platform: "xbox"},
    {_id: "125", username: "username3",platform: "ps4"},
    {_id: "126", username: "username4",platform: "pc"},
    {_id: "127", username: "username5",platform: "ps4"},
    {_id: "128", username: "username6",platform: "pc"}
      ];

let  critarray = [
   {_id: "124", username: "username2",platform: "xbox"},
   {_id: "127", username: "username5",platform: "ps4"},
   {_id: "128", username: "username6",platform: "pc"},
  ];

// all items not in crit array
let arrayFiltered = array.filter(item => !critarray.find(i => i._id === item._id) )

// concat critarray first, then rest
let newArr = critarray.concat(arrayFiltered)

console.log(newArr)

Предполагается, что _id является уникальным идентификатором.

или Сортировка

Кроме того, вы также можетесделайте Set идентификаторов из citarray и используйте включение в этот набор в качестве основы для сортировки, если вы хотите отсортировать массив на месте:

let array = [
    {_id: "123", username: "username1",platform: "xbox"},
    {_id: "124", username: "username2",platform: "xbox"},
    {_id: "125", username: "username3",platform: "ps4"},
    {_id: "126", username: "username4",platform: "pc"},
    {_id: "127", username: "username5",platform: "ps4"},
    {_id: "128", username: "username6",platform: "pc"},
      ];

let  critarray = [
   {_id: "124", username: "username2",platform: "xbox"},
   {_id: "127", username: "username5",platform: "ps4"},
   {_id: "128", username: "username6",platform: "pc"},
  ];

let critIds = new Set
critarray.forEach(item => critIds.add(item._id))

array.sort((a, b) => critIds.has(b._id) - critIds.has(a._id))
console.log(array)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...