Мне нужно знать, содержит ли массив объектов хотя бы два одинаковых объекта в 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.
Отдельные объекты никогда не ===
друг к другу, поэтому вам придется использовать другой метод. Один из вариантов - создать набор строковых объектов и вернуть 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.
Это дает мне индекс первого появления, верно? Я хотел бы знать, есть ли несколько
{value: 'a'}
, а не только индекс первого.