Сортировать массив 1 по идентификатору массива 2. При удалении и добавлении элементов из массива 1 в зависимости от массива 2 - PullRequest
0 голосов
/ 13 июня 2019

У меня есть 2 массива. Каждый заполнен уникальными идентификационными номерами. Я хочу взять первый массив

array1 = [ 
    {"name":"sos", "id":112},
    {"name":"apa", "id":671},
    {"name":"dos", "id":003},
]

И его порядок совпадает с порядком массива2 в зависимости от значения каждого из них. Так что каждый идентификатор массива1 равен массиву2 и наоборот. Другими словами array1 [x] .id == array2 [x] .id для каждого значения x, меньшего или равного длине массива.

array2 = [ 
    {"name":"sqe", "id":671},
    {"name":"pep", "id":003},
    {"name":"try", "id":163},
]

Я также хочу удалить любой элемент в array1, у которого нет соответствующего идентификатора в array2. И добавьте любой элемент в массив1, который имеет значение идентификатора, которого нет в массиве1, но находится в массиве2, при этом снова сортируя его в зависимости от его идентификатора. Array1 должен сохранять свои имена, связанные с каждым значением id, но когда добавляется новый элемент, его имя может быть установлено на имя идентификатора, с которым он соотносится в array2.

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

Ответы [ 3 ]

0 голосов
/ 13 июня 2019
  • Он будет упорядочивать массив2 как массив1:
  • Он удалит элементы из массива 2, если он не существует в массиве 1

array1 = [ {"name":"sos", "id":112},{"name":"apa", "id":671},{"name":"dos", "id":003}]
array2 = [ {"name":"sqe", "id":671},{"name":"pep", "id":003},{"name":"try", "id":163}]

array2 = array2.filter((item2, i) => {
   let match = false;
   array1.forEach((item1, j) => {
       if(item1.id == item2.id) return match = true;
   })
   return  match
})

console.log(array1)
console.log(array2)
0 голосов
/ 13 июня 2019

Создайте карту из своего array1:

let map1 = new Map(array1.map(e => [e.id, e]))

Затем выполните итерацию по вашему array2 и сопоставьте каждый элемент соответствующему элементу в array1.

let newArray1 = array2.map(e => map1.get(e.id));
0 голосов
/ 13 июня 2019

Создание массива из array2, который дает индекс для каждого значения идентификатора:

var indexes = array2.reduce(function(map, entry, index) {
  map[entry.id] = index;
  return map;
}, {});

Теперь вы можете создать новый массив из array1:

var newArray1 = array1.reduce(function(a, entry) {
  a[indexes[entry.id]] = entry;
  return a;
}, []);

Теперь, в ваших примерах данных, ваш array2 не включает все значения идентификаторов, которые присутствуют в array1. Из вашего вопроса не ясно, что делать в таких случаях.

Один из подходов состоит в том, чтобы создать справочную таблицу из всех значений идентификатора в array2, а затем добавить к ней недостающие значения идентификатора из array1 с некоторыми большими значениями индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...