Как найти вхождение объектов в массив

Мне нужно знать, содержит ли массив объектов хотя бы два одинаковых объекта в JavaScript.

У меня есть форма, которая позволяет людям создавать вопросы (название, описание, тип, варианты ответа). Мне нужно проверить, ввел ли пользователь несколько вариантов ответа с одним и тем же ярлыком. Они хранятся в массиве.

// The array of answer options
let array = [{value: 'a'}, {value: 'b'}, {value: 'c'}, {value: 'a'}]

Я пытался использовать array.indexOf({value: 'a'}) и array.lastIndexOf({value: 'a'}), но они оба дают мне индекс -1.

Поведение ключевого слова "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) для оценки ваших знаний,...
0
0
193
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Используйте findIndex:

let array = [{value: 'a'}, {value: 'b'}, {value: 'c'}, {value: 'a'}];
const index = array.findIndex(({ value }) => value == "a");
console.info(index);

Это дает мне индекс первого появления, верно? Я хотел бы знать, есть ли несколько {value: 'a'}, а не только индекс первого.

user10111799 28.05.2019 01:33
Ответ принят как подходящий

Отдельные объекты никогда не === друг к другу, поэтому вам придется использовать другой метод. Один из вариантов - создать набор строковых объектов и вернуть true, как только будет найдена любая повторяющаяся строка:

const hasDupes = (arr) => {
  const strings = new Set();
  for (const obj of arr) {
    const string = JSON.stringify(obj);
    if (strings.has(string)) {
      return true;
    }
    strings.add(string);
  }
  return false;
};
console.info(hasDupes([{value: 'a'}, {value: 'b'}, {value: 'c'}, {value: 'a'}]));
console.info(hasDupes([{value: 'a'}, {value: 'b'}, {value: 'c'}]));

indexOf вернет экземпляр объекта

{value: 'a'} !== {value: 'a'};

поскольку они оба являются разными экземплярами объектов.

Вы можете найти объект

const obj = array.find(item => item.value === 'a')

Если вы беспокоитесь только о свойстве value и ваш вариант использования не является более сложным, вы можете просто сделать это в одной строке с помощью:

let hasDupes = arr => new Set(arr.map(x => x.value)).size !== arr.length

console.info(hasDupes([{value: 'a'}, {value: 'b'}, {value: 'c'},{value: 'a'}]))
console.info(hasDupes([{value: 'a'}, {value: 'b'}, {value: 'c'}]))

Вы должны использовать Задавать, чтобы добавить значения value, и если его размер меньше фактической длины входного массива, чем у вас были дубликаты. Нет необходимости делать JSON.stringify, сравнивать строки и т. д., если вас интересует только одно проверяемое свойство.

Также JSON.stringify имеет проблемы при сравнении равенства объектов.

Вы можете использовать lodash.js для сравнения двух объектов. См. образец ниже.

let array = [{ value: "a" }, { value: "b" }, { value: "c" }, { value: "a" }];

const object = { value: "a" };

countObjOccurrences = object => {
  let occurances = 0;
  array.map(item => {
    if (_.isEqual(item, object)) {
      occurances += 1;
    }
  });
  return occurances;
};

Эта функция вернет 2.

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