Как выполнить фильтрацию между двумя массивами объектов - PullRequest
0 голосов
/ 31 мая 2018

У меня есть 2 массива следующим образом:

 var arr1 = [{'_id':'192983','nt':'1246699993'},{'_id':'192984','nt':'1246699994'}]; 

 var arr2 = [{'title':'ABX1','nt':'2398389'},{'title':'ABX2','nt':'1246699994'}]; 

Ожидаемый результат:

[{'title':'ABX2','nt':'1246699994'}]

Из 2 массивов я хочу исключить тот, который соответствует клавише 'nt' воба массива,

Я пробовал, как показано ниже,

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

      for (var j = 0;j < arr2.length;j++) {
             if (arr1[i].nt !== arr2[j].nt) {
                   finalArr.push(arr2[j]);
              }
      }
}

Но этот цикл потребляет n энергии 2 раза.Может кто-нибудь, пожалуйста, предложите мне самый простой способ сделать это.Спасибо.

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Если вас беспокоит неэффективность, сравните два подхода ниже:

Неэффективно (максимум i * j итераций):

var list1 = [1, 2, 3, 4, 5, 6];
var list2 = ['a', 'b', 'c', 3, 'd', 'e'];

for (var i in list1) {
    for (var j in list2) {
        if (list1[i] == list2[j]) {
            alert('found ' + list1[i] + ' in both lists');
        }
    }
}

Эффективно (максимум i + j итераций)

var list1 = [1, 2, 3, 4, 5, 6];
var list2 = ['a', 'b', 'c', 3, 'd', 'e'];
var lookup = {};

for (var j in list2) {
    lookup[list2[j]] = list2[j];
}

for (var i in list1) {
    if (typeof lookup[list1[i]] != 'undefined') {
        alert('found ' + list1[i] + ' in both lists');
        break;
    } 
}

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

0 голосов
/ 31 мая 2018

     var arr1 = [{'_id':'192983','nt':'1246699993'},{'_id':'192984','nt':'1246699994'}]; 

     var arr2 = [{'title':'ABX1','nt':'2398389'},{'title':'ABX2','nt':'1246699994'}]; 

    let answer = [];

    arr2.forEach(x => {
      if(!arr1.some(y => y['nt'] === x['nt'])){
        answer.push(x)
      }
    })

    console.log(answer)

Приведенный выше ответ основан на том, что вы написали.Вы хотите найти аналогичный элемент и исключить его, то есть не включать, следовательно, результат должен быть {'title':'ABX1','nt':'2398389'}

Но в зависимости от ожидаемого результата вы хотите {'title':'ABX2','nt':'1246699994'}.

В любом случаеперейдите к моему решению и в условии if удалите !, чтобы получить ожидаемый результат

В качестве альтернативы, вместо использования forEach, вы можете использовать метод filter, как показано ниже

let answer = arr2.filter(x=> {
    	return arr1.some(y=>y['nt']===x['nt']);
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...