Обход массивов, вложенных в объекты, для поиска совпадений - PullRequest
0 голосов
/ 06 июля 2018

У меня есть следующий массив, который содержит ряд объектов. Внутри каждого объекта есть свойство с массивом.

const films = [
    {
    name: 'Ant-Man and the Wasp',
    genre: ['Action' , 'Adventure' , 'Sci-Fi' , 'Comedy']
  },
  {
    name: 'Sorry to Bother You',
    genre: ['Comedy' , 'Fantasy']
  },
  {
    name: 'Jurassic World: Fallen Kingdom',
    genre: ['Action' , 'Adventure' , 'Sci-Fi'],
  },
  {
    name: 'Incredibles 2',
    genre: ['Action' , 'Crime' , 'Drama' , 'Thriller']
  },
  {
    name: 'Deadpool 2',
    genre: ['Action' , 'Adventure' , 'Comedy']
  }
];

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

for (let i = 0; i < films.length; i++) {
  let film = films[i];
  let genres = film.genre;

  for (let j; j < genres.length; j++) {
    if (genres[j] == "Action") {
      console.log('Match');
    } else {
      console.log('No Match');
    }
  }
}

Ответы [ 4 ]

0 голосов
/ 06 июля 2018

Ключ в других объектах отличается. В последних 3 объектах ключ - это «зависимости», а не «жанр». Так что при обходе последних 3 объектов films[i].genre равен undefined, поэтому при genres.length

Если вы хотите также пройти через «зависимости», используйте следующий код

for (let i = 0; i < films.length; i++) {
 let film = films[i];
 let genres = film.genre||film.dependencies;//if no 'genre' then check 'dependencies' 
 if(!genre){continue;}//if there is none then skip the loop
 for (let j; j < genres.length; j++) {
  if (genres[j] == "Action") {
   console.log('Match');
  } else {
   console.log('No Match');
  }
 }
}
0 голосов
/ 06 июля 2018

Я работаю в предположении, что два разных имени свойства не являются опечаткой и что у вас есть genre и dependencies.

В любом случае, вы можете сделать это с помощью одной строки:

const films = [{name: 'Ant-Man and the Wasp',genre: ['Action' , 'Adventure' , 'Sci-Fi' , 'Comedy']},{name: 'Sorry to Bother You',genre: ['Comedy' , 'Fantasy']},{name: 'Jurassic World: Fallen Kingdom',dependencies: ['Action' , 'Adventure' , 'Sci-Fi'],},{name: 'Incredibles 2',dependencies: ['Action' , 'Crime' , 'Drama' , 'Thriller']},{name: 'Deadpool 2',dependencies: ['Action' , 'Adventure' , 'Comedy']}];

let actionflicks = films.filter(f => (f.genre || f.dependencies).includes( 'Action'))
console.log(actionflicks)

Что касается вашего кода, это неплохое начало, но с ошибками. Вы должны привыкнуть смотреть на консоль, когда что-то не работает. Это укажет вам на то, что не так.

0 голосов
/ 06 июля 2018

Применить условие перед циклом жанров

for (let i = 0; i < films.length; i++) {
  let film = films[i];
  let genres = film.genre;

  if (genres != undefined){
  for (let j; j < genres.length; j++) {
    if (genres[j] == "Action") {
      console.log('Match');
    } else {
      console.log('No Match');
    }
  }
  }
}
0 голосов
/ 06 июля 2018

В этом коде много опечаток. Правильный код должен быть:

const films = [
    {
    name: 'Ant-Man and the Wasp',
    genre: ['Action' , 'Adventure' , 'Sci-Fi' , 'Comedy']
  },
  {
    name: 'Sorry to Bother You',
    genre: ['Comedy' , 'Fantasy']
  },
  {
    name: 'Jurassic World: Fallen Kingdom',
    genre: ['Action' , 'Adventure' , 'Sci-Fi'],
  },
  {
    name: 'Incredibles 2',
    genre: ['Action' , 'Crime' , 'Drama' , 'Thriller']
  },
  {
    name: 'Deadpool 2',
    genre: ['Action' , 'Adventure' , 'Comedy']
  }
];

for (let i = 0; i < films.length; i++) {
  let film = films[i];
  let genres = film.genre;

  for (let j = 0; j < genres.length; j++) {
    if (genres[j] == "Action") {
      console.log('Match');
    } else {
      console.log('No Match');
    }
  }
}

Как отметил Марк, некоторые объекты в массиве имеют свойства, называемые "зависимости", которые следует называть "жанром". Также "for (пусть j; j

...