Как проверить, содержит ли массив объектов все идентификаторы другого массива объектов JS

#javascript #arrays #object #foreach #verification

#javascript #массивы #объект #foreach #проверка

Вопрос:

У меня есть 2 массива объектов;

 // First one :
[0: {id: 1},
1: {id: 2},
2: {id: 3},
3: {id: 4}]

// Second one :
[0: {id: 10},
1: {id: 1},
2: {id: 4},
3: {id: 76},
4: {id: 2},
5: {id: 47},
6: {id: 3}]
  

Я хотел бы проверить, имеет ли второй по крайней мере те же идентификаторы, что и первый. Что было бы верно в этом случае, потому что второй содержит 1, 2, 3 и 4 идентификатора.

Я пытался использовать some() и every(), но это не работает должным образом

Моя попытка :

 let res = this.trainingEpisodesList.some( episode => {
    this.completedEpisodes.every( userEpisode => {
         userEpisode.id == episode.id;
     })
});
  

Спасибо 😉

Комментарии:

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

2. Отсутствие возврата чего-либо внутри вызова some or every является одной из причин, почему ваша попытка не будет делать то, что вы хотите. Я бы также получил лучшую среду IDE / linter (или настроил их должным образом), утверждение типа userEpisode.id == episode.id; должно быть автоматически помечено как «вероятно, ошибка».

Ответ №1:

ES7,

 let result = one.map(a => a.id);
let result2 = two.map(a => a.id);
const final_result = result.every(val => result2.includes(val));
  

ES5,

 var result = one.map(a => a.id);
var result2 = two.map(a => a.id);

var final_result = result.every(function(val) {

  return result2.indexOf(val) >= 0;

});
  

Ответ №2:

Вы можете сделать это с помощью every и find :

 let completedEpisodes = 
[
{id: 1},
{id: 2},
{id: 3},
{id: 4}
]

let trainingEpisodesList = 
[
{id: 10},
{id: 1},
{id: 4},
{id: 76},
{id: 2},
{id: 47},
{id: 3}
]

let containsAllCompleted = trainingEpisodesList.every(c => completedEpisodes.find(e=>e.id==c.id));

console.log(containsAllCompleted);  

Комментарии:

1. Нет, это не работает, он просто возвращает false, поскольку он должен возвращать true. Я хотел бы иметь значение TRUE, если completedEpisodes содержит идентификаторы каждого обучающего списка

2. @LuDo если приведенный выше пример подходит для вас, то обращение массивов в операции должно исправить это. Я обновил ответ. Теперь в ответе проверяется, завершены ли все обучающие эпизоды

3. Большое тебе спасибо, чувак, не мог бы ты немного объяснить, что делает эта комбинация методов, пожалуйста? Я прочитал документацию, но это все еще не так ясно:(

4. Конечно. Итак, цель вопроса состояла в том, чтобы проверить, все ли элементы в trainingEpisodesList находятся в completedEpisodes заданном id качестве идентификатора. Используются две функции: every которая проверяет, соответствуют ли все элементы массива определенному условию, и find которая проверяет, есть ли в массиве элемент с определенным id . Итак, что мы должны сделать, это проверить, соответствует ли every элемент в списке эпизодов обучения нашему условию, которое присутствует в завершенном списке (с помощью find ).

5. Звучит логично, слишком много было потеряно в чтениях, чтобы довести это до конца. Спасибо