Как найти вхождение объектов в массив - PullRequest
0 голосов
/ 28 мая 2019

Мне нужно знать, содержит ли массив объектов хотя бы два одинаковых объекта в 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.

Ответы [ 5 ]

1 голос
/ 28 мая 2019

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

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

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

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

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

1 голос
/ 28 мая 2019

Отдельные объекты никогда не равны === друг другу, поэтому вам придется использовать другой метод. Один из вариантов заключается в создании набора из строковых объектов и возвращении 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.log(hasDupes([{value: 'a'}, {value: 'b'}, {value: 'c'}, {value: 'a'}]));
console.log(hasDupes([{value: 'a'}, {value: 'b'}, {value: 'c'}]));
0 голосов
/ 28 мая 2019

Вы можете использовать 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.

0 голосов
/ 28 мая 2019

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

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

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

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

const obj = array.find(item => item.value === 'a')
0 голосов
/ 28 мая 2019

Использование findIndex:

let array = [{value: 'a'}, {value: 'b'}, {value: 'c'}, {value: 'a'}];
const index = array.findIndex(({ value }) => value == "a");
console.log(index);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...