Javascript - проверьте, находятся ли определенные значения в массиве объектов

Скажем, у меня есть массив из 5 объектов, каждый из которых имеет 2 ключа (например, «название» и «автор»).

Я хочу проверить достоверность того, что в массиве существуют 3 КОНКРЕТНЫХ названия.

Как лучше всего это сделать?

У меня есть следующее... но это не кажется очень эффективным:

const books = [
  { title: 'Book1', author: 'Author1' },
  { title: 'Book2', author: 'Author2' },
  { title: 'Book3', author: 'Author3' },
  { title: 'Book4', author: 'Author4' },
  { title: 'Book5', author: 'Author5' },
];

const certainBooks = books.some((b) => b.title === 'Book2')
   && books.some((b) => b.title === 'Book3')
   && books.some((b) => b.title === 'Book5')

if (certainBooks) {
  // Do stuff
}

Это то, что вам нужно делать часто? Являются ли три конкретных названия динамическими или фиксированными? Всегда ли это три?

Phil 23.03.2022 00:26

Эта функция может получить 5 тысяч обращений в месяц, так что это будет довольно высокий трафик. Тем не менее, 3 названия являются специфическими - я всегда буду искать одни и те же 3 в возможном массиве из 1-5 книг.

brandonstiles 23.03.2022 01:07
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
48
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

const books = [
  { title: 'Book1', author: 'Author1' },
  { title: 'Book2', author: 'Author2' },
  { title: 'Book3', author: 'Author3' },
  { title: 'Book4', author: 'Author4' },
  { title: 'Book5', author: 'Author5' },
];
const titles = books.map(({ title }) => title);
const toFind = ['Book2', 'Book3', 'Book5'];
if (toFind.every(title => titles.includes(title))) {
  console.info('do stuff');
}

Если массив книг большой, вы можете извлечь выгоду, создав titles набор вместо массива — Set#has быстрее, чем Array#includes, когда элементов много.

Если значения и количество заголовков являются динамическими, возможно, стоит создать индекс заголовков в массиве; что-то с временной сложностью О(1) для более быстрого поиска

const books = [
  { title: 'Book1', author: 'Author1' },
  { title: 'Book2', author: 'Author2' },
  { title: 'Book3', author: 'Author3' },
  { title: 'Book4', author: 'Author4' },
  { title: 'Book5', author: 'Author5' },
];

const titleIndex = new Set(books.map(({ title }) => title));

const titlesExist = (...titles) =>
  titles.every(title => titleIndex.has(title))

console.info("Book2, Book3, Book5:", titlesExist("Book2", "Book3", "Book5"));
console.info("Book1:", titlesExist("Book1"));
console.info("Book5, Book6:", titlesExist("Book5", "Book6"));

Хороший призыв! В этом случае он будет динамическим только для каждого запроса. Таким образом, клиент может отправить от 1 до 5 книг, и я проверяю наличие 3 конкретных книг по этому запросу, прежде чем приступить к работе.

brandonstiles 23.03.2022 00:46

Мне очень нравится эта идея кстати! Я попробую это, а затем отмечу как решенное!

brandonstiles 23.03.2022 01:10

Вы можете зациклиться на них

const books = [
  { title: "Book1", author: "Author1" },
  { title: "Book2", author: "Author2" },
  { title: "Book3", author: "Author3" },
  { title: "Book4", author: "Author4" },
  { title: "Book5", author: "Author5" },
];

const booksNeeded = ["Book2", "Book3", "Book4"];
for (let book of books) {
  const lookForIndex = booksNeeded.findIndex(
    (title) => title.toLowerCase() === book.title.toLowerCase()
  );
  if (lookForIndex !== -1) {
    booksNeeded.splice(lookForIndex, 1);
  }
  if (!booksNeeded.length) {
    break; // Early break if all the books has been found
  }
}


if (!booksNeeded.length) {
  console.info("Do Something");
} else {
  console.info("Something else");
}


const books = [
  { title: 'Book1', author: 'Author1' },
  { title: 'Book2', author: 'Author2' },
  { title: 'Book3', author: 'Author3' },
  { title: 'Book4', author: 'Author4' },
  { title: 'Book5', author: 'Author5' },
];

let ops     = 0;
let search  = [ "Book2", "Book3", "Book4" ];
let { length } = search;

for ( let i = 0, len = books.length; length && i < len; i++ ){
  ops++;
  if ( search.includes(books[i].title) ){
    length--;
  }
}

if ( !length ){
  console.info("All books found!");
} else {
  console.info("Not all books found!")
}
console.info( "Number of operations: ", ops ); 

Другие вопросы по теме