Как проверить, все ли объекты массива включены в другой массив? - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь проверить, содержит ли объект array A objects из B.

let A = [
    { name: "Max" },
    { name: "Jhon" },
    { name: "Naton" },
]

let B = [
    { name: "Max" },
    { name: "Naton" },
]

Итак, B имеет два objects, что в array A. Как это проверить?

Я пытаюсь достичь этого с помощью includes:

  for(let entry of this.b){
      if(this.a.includes(entry)){
        console.log('includes');
      }
    }

Но я получаю false на includes.

Ответы [ 3 ]

0 голосов
/ 10 января 2019

Когда вы используете Array#includes() метод , он всегда будет возвращать false , потому что он сравнивает objects, которые не равны , потому что они не ' t ссылается на тот же object.

Вы должны сравнивать объекты properties, а не целые объекты, вы можете сделать это, используя Array#some() метод следующим образом:

for (let entry of this.b) {
  if (this.b.some(x => x.name === entry.name)) {
    console.log('includes');
  }
}

Демо-версия:

A = [{
    name: "Max"
  },
  {
    name: "Jhon"
  },
  {
    name: "Naton"
  },
]

B = [{
    name: "Max"
  },
  {
    name: "Naton"
  },
]

//Filter objects that exists in both arrays
let result = A.filter(el=> B.some(x => x.name === el.name));
console.log(result);
0 голосов
/ 10 января 2019

Метод Array.includes() сравнивает записи массива с заданным значением. Поскольку ваши записи массива являются объектами, они не будут совпадать. Вы должны сами зациклить массив и сделать сравнение.

Array.some() зацикливается на массиве и возвращает true, если вы возвращаете true хотя бы один. Этот метод полезен, когда вы хотите что-то проверить. В нашем примере мы хотим проверить, содержит ли массив a запись b.

const a = [{
    name: 'Max',
  },
  {
    name: 'Jhon',
  },
  {
    name: 'Naton',
  },
];

const b = [{
    name: 'Max',
  },
  {
    name: 'Naton',
  },
  {
    name: 'Daddy',
  },
];

console.log(b.map(x => a.some(y => y.name === x.name)));

Если я сломаю это:

const a = [{
    name: 'Max',
  },
  {
    name: 'Jhon',
  },
  {
    name: 'Naton',
  },
];

const b = [{
    name: 'Max',
  },
  {
    name: 'Naton',
  },
  {
    name: 'Daddy',
  },
];

// Loop on every entry of the b array
b.forEach((x) => {
  // x here represent one entry
  // first it will worth { name: 'Max' }, then { name: 'Naton' } ...
  // for each value we are going to look at a if we can find a match
  const isThereAMatch = a.some((y) => {
    // y here is worth one entry of the a array
    if (y.name === x.name) return true;

    return false;
  });

  if (isThereAMatch === true) {
    console.log(`We have found ${x.name} in a`);
  } else {
    console.log(`We have not found ${x.name} in a`);
  }
});
0 голосов
/ 10 января 2019

Вы должны использовать другой цикл, затем проверьте имя свойства:

var a = [
  {name: "Max"},
  {name: "Jhon"},
  {name: "Naton"},
];
var b = [
  {name: "Max"},
  {name: "Naton"},
];

for(let entry of b){
  for(let entry2 of a){
    if(entry2.name == entry.name){
      console.log('includes', entry.name);
    }
  }
}

ИЛИ: Вы можете использовать строковую версию объекта для проверки с помощью includes():

var a = [
  {name: "Max"},
  {name: "Jhon"},
  {name: "Naton"},
];
var b = [
  {name: "Max"},
  {name: "Naton"},
];
var aTemp = a.map(i => JSON.stringify(i));
var bTemp = b.map(i => JSON.stringify(i));
for(let entry of bTemp){
  if(aTemp.includes(entry)){
    console.log('includes', entry);
  }
}
...