сравнить два массива и удалить объект по идентификатору объекта javascript - PullRequest
0 голосов
/ 20 декабря 2018

мой проверенный код:

    const data1 = [{ id: 1, name: 'dd' }, { id: 2, name: 'dd' }, { id: 3, name: 'dd' }, { id: 4, name: 'dd' }, { id: 5, name: 'dd' }];
    const sasas = [];
    const data2 = [{ id: 2, name: 'dd' },{ id: 4, name: 'dd' }, { id: 5, name: 'dd' }];
    data2.map((io) => {
     sasas.push(io.id);
     });
    
    sasas.forEach((ik) => {
     for (let i = 0; i < data1.length - 1; i++) {
       if (data1[i].id === ik) {
          data1.splice(i, 1);
            }
          }
      });
    console.log(data1);

У меня есть два массива, и я отображаю данные data2 и получаю значения идентификатора в sasas .

затем для каждого sasas данных,

и использования forloop для соединения индексных данных data1 .

, затем получаяответ: id: 1, id: 3, id: 5 объекты in data1 .

, но мой ожидаемый результат:

const data1 = [{ id: 1, name: 'dd' },{ id: 3, name: 'dd' }];

пожалуйста, помогите мне!

Ответы [ 4 ]

0 голосов
/ 20 декабря 2018

Прежде всего, вы могли бы лучше использовать эту карту, вместо

data2.map((io) => {
    sasas.push(io.id);
});

вы могли бы просто:

sasas = data2.map(io => io.id);

Ваша ошибка:

for (let i = 0; i < data1.length - 1; i++) {

Это означает, что вы никогда не проверяете последний индекс массива, вы можете либо изменить < на <=, либо просто удалить -1.

Это должно работать:

for (let i = 0; i < data1.length; i++) {

Array.filter

Функциональность, которую вы пытаетесь достичь, легко доступна с помощью функции .filter (), например:

    const data1 = [{ id: 1, name: 'dd' }, { id: 2, name: 'dd' }, { id: 3, name: 'dd' }, { id: 4, name: 'dd' }, { id: 5, name: 'dd' }];
    const data2 = [{ id: 2, name: 'dd' },{ id: 4, name: 'dd' }, { id: 5, name: 'dd' }];
    const sasas = data2.map((io) => io.id);
    
    var result = data1.filter(e => sasas.indexOf(e.id) === -1)
    console.log(result);
0 голосов
/ 20 декабря 2018

Попробуйте это

data1.filter(x=> !data2.some(y=> y.id==x.id ))

const data1 = [{ id: 1, name: 'dd' }, { id: 2, name: 'dd' }, { id: 3, name: 'dd' }, { id: 4, name: 'dd' }, { id: 5, name: 'dd' }];
const data2 = [{ id: 2, name: 'dd' },{ id: 4, name: 'dd' }, { id: 5, name: 'dd' }];

let result = data1.filter(x=>!data2.some(y=>y.id==x.id))

console.log(result);

Выше короткое время решения сложность составляет O (n * m) , ниже O (n + m) версия (n, m - длины массивов):

let h = {}; data2.map(x=>h[x.id]=1); 
let result = data1.filter(x=>!h[x.id]);

const data1 = [{ id: 1, name: 'dd' }, { id: 2, name: 'dd' }, { id: 3, name: 'dd' }, { id: 4, name: 'dd' }, { id: 5, name: 'dd' }];
const data2 = [{ id: 2, name: 'dd' },{ id: 4, name: 'dd' }, { id: 5, name: 'dd' }];

let h = {}; data2.map(x=>h[x.id]=1);     // we use hash map with data2 ids
let result = data1.filter(x=>!h[x.id]);

console.log(result);
0 голосов
/ 20 декабря 2018

Из-за этого цикла i останавливается на data1.length - 2

for (let i = 0; i < data1.length - 1; i++) {

Переменная i должна быть от 0 до data1.length - 1, что делает условие равным

i < data1.length
0 голосов
/ 20 декабря 2018

Вы можете попробовать следующие 2 подхода.Кроме того, вместо создания массива вы можете использовать Set (лучшая производительность)

Обновить существующий массив, используя цикл while

const data1 = [{ id: 1, name: 'dd' }, { id: 2, name: 'dd' }, { id: 3, name: 'dd' }, { id: 4, name: 'dd' }, { id: 5, name: 'dd' }];
const data2 = [{ id: 2, name: 'dd' },{ id: 4, name: 'dd' }, { id: 5, name: 'dd' }];

const sasas = data2.reduce((a,{id}) => a.add(id), new Set())
let i = 0;
while(i < data1.length) {
  if(sasas.has(data1[i].id)) {
    data1.splice(i,1);
  } else i++;
}
console.log(data1);

Создание нового массива с использованием Array.filter

const data1 = [{ id: 1, name: 'dd' }, { id: 2, name: 'dd' }, { id: 3, name: 'dd' }, { id: 4, name: 'dd' }, { id: 5, name: 'dd' }];
const data2 = [{ id: 2, name: 'dd' },{ id: 4, name: 'dd' }, { id: 5, name: 'dd' }];

const sasas = data2.reduce((a,{id}) => a.add(id), new Set())

const result = data1.filter(({id}) => !sasas.has(id));
console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...