Как сравнить два массива, удалить первый элемент, отсутствующий во втором, и указать разницу - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть два массива с «билетами», которые мне нужно обновлять каждые 3 секунды, проблема в том, что по соображениям анимации я не могу просто перезаписать первый массив так, как второй.

Вот так:

let array_1 = [1, 2, 3, 5]; //diff 3, 5
let array_2 = [1, 2, 6, 7]; //diff 6, 7

Мне нужно сравнить два массива, удалить"3 и 5" и push"6 и 7" с первыммассив, оставляя первый массив следующим образом:

array_1 = [1, 2, 6, 7];

Как это сделать?

[РЕДАКТИРОВАТЬ]

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

I CANNOT имеют третий массив или перезаписывают первый, потому что это приведет кмаркеры должны «мигать» на карте, поэтому я должен манипулировать первым.

Я использовал ответ @Andrew Yochum ниже, чтобы найти решение следующим образом:

let array_1 = [
    {serial_number: 'abc', lat: 1, lng: 1},
    {serial_number: 'def', lat: 2, lng: 2},
    {serial_number: 'ghi', lat: 3, lng: 3},
];

let array_2 = [
    {serial_number: 'abc', lat: 1, lng: 1},
    {serial_number: 'def', lat: 2, lng: 2},
    {serial_number: 'jkl', lat: 4, lng: 4},
    {serial_number: 'mno', lat: 5, lng: 5},
];

let compare_1 = JSON.parse(JSON.stringify(array_1));
compare_1 = compare_1.map(el => JSON.stringify(el));

let compare_2 = JSON.parse(JSON.stringify(array_2));
compare_2 = compare_2.map(el => JSON.stringify(el));

let removeArray = [...compare_1.filter(i => !compare_2.includes(i))];
let addArray = [...compare_2.filter(i => !compare_1.includes(i))];

compare_1.forEach((first_el) => {
    removeArray.forEach((second_el) => {
        if(first_el == second_el){
            array_1.splice(compare_1.indexOf(first_el, 1));
        }
    });
});

addArray.forEach((element) => {
    array_1.push(JSON.parse(element));
});

Есть ли способ оптимизировать это?

Ответы [ 3 ]

2 голосов
/ 23 апреля 2019

Учитывая ваши новые ограничения, связанные с необходимостью редактирования исходного массива на месте, и предоставленные вами образцы данных, это довольно оптимальное решение без кодирования / декодирования JSON, которое использует ваше решение.Новые массивы или копии не создаются.Также предполагается, что serial_number является уникальным ключом, который можно использовать для дедупликации между массивами.

let array_1 = [
    {serial_number: 'abc', lat: 1, lng: 1},
    {serial_number: 'def', lat: 2, lng: 2},
    {serial_number: 'ghi', lat: 3, lng: 3},
]; //diff 'ghi'
let array_2 = [
    {serial_number: 'abc', lat: 1, lng: 1},
    {serial_number: 'def', lat: 2, lng: 2},
    {serial_number: 'jkl', lat: 4, lng: 4},
    {serial_number: 'mno', lat: 5, lng: 5},    
]; //diff 'jkl' 'mno'

function containsSerialNumber(array, serial_number) {
    for(let i = 0; i < array.length; i++) {
        if (array[i].serial_number === serial_number) {
            return true;
        }
    }
}

// removes 'ghi'
for (let i = 0; i < array_1.length; i++) {
    if (!containsSerialNumber(array_2, array_1[i].serial_number)) {
        array_1.splice(i,1);
        i--; // Adjust i down since we just edited in-place
    }
}

// add 'jkl' 'mno'
for (let i = 0; i < array_2.length; i++) {
    if (!containsSerialNumber(array_1, array_2[i].serial_number))
        array_1.push(array_2[i]);
}  
0 голосов
/ 24 апреля 2019

на основании того, что вы сказали: «Мне нужно сравнить два массива, убрать« 3 и 5 »и вставить« 6 и 7 »в первый массив»:

let array_1 = [1, 2, 3, 5]; //diff 3, 5
let array_2 = [1, 2, 6, 7]; //diff 6, 7

for(var i = 0; i < array_1.length; i++){

  if(array_1[i] != array_2[i]){
        array_1.splice(i,1,array_2[i]);
  }
}
console.log(array_1);
0 голосов
/ 23 апреля 2019

let array_1 = [1, 2, 3, 5]; //diff 3, 5
let array_2 = [1, 2, 6, 7]; //diff 6, 7

for(var i = 0; i < array_1.length; i++){
  if(array_1[i] != array_2[i]){
    array_1[i] = array_2[i];
  }
}
console.log(array_1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...