JavaScript получает элементы из массива объектов, которых нет в другом - PullRequest
0 голосов
/ 13 июня 2018

Я новичок в программировании на JavaScript, и у меня есть два массива объектов, которые имеют следующую структуру:

myFirstObjArray = [{foo: 1, bar: 1}, {foo: 3, bar: 3}, {foo: 4, bar: 5}];
mySecondObjArray = [{foo: 2}, {foo: 4}, {foo: 5}];

Мне нужно получить два отдельных массива, содержащих значения ключа foo, первый из которых содержитте, которые находятся в первом массиве, но не во втором, на основе значения ключа foo, а вторые, которые находятся в mySecondObjArray, но не в myFirstObjArray.

Есть ли способсделать это без

for(i=0;i<myFirstObjArray.length;i++)
   for(j=0;j<mySecondObjArray .length;j++)
      {...build first array here}

for(i=0;i<mySecondObjArray .length;i++)
   for(j=0;j<myFirstObjArray.length;j++)
      {...build second array here}

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

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

firstArray = [{foo: 1}, {foo: 3}];
secondArray = [{foo: 2}, {foo: 5}];

Ответы [ 5 ]

0 голосов
/ 13 июня 2018

ES5 без использования жирной стрелки,

var myFirstObjArray = [{foo: 1, bar: 1}, {foo: 3, bar: 3}, {foo: 4, bar: 5}],
    mySecondObjArray = [{foo: 2}, {foo: 4}, {foo: 5}],
    
    firstArray  = myFirstObjArray.filter(function(o) { return !mySecondObjArray.some(function(i) { return i.foo === o.foo})});
     
    secondArray  = mySecondObjArray.filter(function(o) { return !myFirstObjArray.some(function(i) { return i.foo === o.foo})});
    
    console.log(firstArray)
    console.log(secondArray)
0 голосов
/ 13 июня 2018

Вот небольшое решение с filter и map с атрибутом foo.

const myFirstObjArray = [{foo: 1, bar: 1}, {foo: 3, bar: 3}, {foo: 4, bar: 5}];
const mySecondObjArray = [{foo: 2}, {foo: 4}, {foo: 5}];

const exclude = (arr1, arr2) => arr1.filter(o1 => arr2.map(o2 => o2.foo).indexOf(o1.foo) === -1);

console.log(exclude(myFirstObjArray, mySecondObjArray));
console.log(exclude(mySecondObjArray, myFirstObjArray));
0 голосов
/ 13 июня 2018

Вы можете отфильтровать поиск.

const unique = a => o => !a.some(({ foo }) => o.foo === foo);

var first = [{foo: 1, bar: 1}, {foo: 3, bar: 3}, {foo: 4, bar: 5}],
    second = [{foo: 2}, {foo: 4}, {foo: 5}],
    uniqueFirst = first.filter(unique(second)),
    uniqueSecond = second.filter(unique(first));
    
console.log(uniqueFirst);
console.log(uniqueSecond);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 13 июня 2018

Вы можете создать функцию многократного использования, чтобы предотвратить дублирование кода.Просто переключитесь на параметр функции.Также обратите внимание, что внутренний цикл - это простой цикл for, поэтому мы можем использовать break и избежать ненужных проверок.

var firstArray = [];
var secondArray = [];
var myFirstObjArray = [{foo: 1, bar: 1}, {foo: 3, bar: 3}, {foo: 4, bar: 5}];
var mySecondObjArray = [{foo: 2}, {foo: 4}, {foo: 5}];

function difference(myFirstObjArray, mySecondObjArray){
  var firstArray = [];
  myFirstObjArray.forEach((obj)=>{
   var match = false;
   for(var i=0; i<mySecondObjArray.length; i++){
     var secondObj = mySecondObjArray[i];
     if(obj.foo === secondObj.foo){
       match = true;
       break;
     }
   }
   if(!match){
     firstArray.push({'foo': obj.foo});
   }
  });
  return firstArray;
}


console.log(difference(myFirstObjArray, mySecondObjArray));

console.log(difference(mySecondObjArray, myFirstObjArray));
0 голосов
/ 13 июня 2018

Вы можете просто отфильтровать элементы одного массива, установив условие на основе элементов другого массива, например.

var myFirstObjArray = [{foo: 1, bar: 1}, {foo: 3, bar: 3}, {foo: 4, bar: 5}],
    mySecondObjArray = [{foo: 2}, {foo: 4}, {foo: 5}],
    
    firstArray  = myFirstObjArray.filter(o=> !mySecondObjArray.some(i=> i.foo === o.foo));
    
    secondArray  = mySecondObjArray.filter(o=> !myFirstObjArray.some(i=> i.foo === o.foo));
    
    console.log(firstArray.map(o=> {return {'foo' :  o.foo}}))
    console.log(secondArray.map(o=> {return {'foo' :  o.foo}}))

Ps:

Метод some() проверяет, прошел ли хотя бы один элемент в массиве тест, реализованный предоставленной функцией.И я добавил функцию, которая просто проверяет, существует ли свойство foo в другом массиве с тем же значением, чтобы иметь возможность фильтрации из первого массива.

В конце вы можете использовать .map дляотфильтруйте нужные пары значений ключей

Надеюсь, что имеет смысл

Подробнее о .some и filter

...