@wufapexef

Как предотвратить добавление в массив значения, которое там уже есть?

Есть данные:

articleArray: [ this.data ]

И метод:

async addArticle () {
      let { data } = await axios.get(`articles/firm`)

      if (this.articleArray.indexOf(data) === -1) {
        this.articleArray.push(data)
      } else {
        return false
      }
    }

Почему, несмотря на проверку indexOf, всё равно добавляется неуникальный элемент в массив?
  • Вопрос задан
  • 151 просмотр
Решения вопроса 1
0xD34F
@0xD34F Куратор тега Vue.js
if (this.articleArray.indexOf(data) === -1) {
  this.articleArray.push(data)

всё равно добавляется

А, позвольте поинтересоваться, каков тип значения, которое вы пытаетесь добавить? Не объект ли? При сравнении объектов сравниваются их ссылки, а не содержимое. Поэтому проверку наличия элемента надо выполнять иначе, по id (если таковой имеется, или другому уникальному свойству), как-то так:

if (!this.articleArray.some(n => n.id === data.id)) {
  ...

Если вдруг попытки добавить уже присутствующие в массиве элементы будут производиться часто, то, чтобы постоянно не бегать по массиву, можно сделать вычисляемое свойство, представляющее набор id содержащихся в массиве объектов и проверять, содержится ли в нём id проверяемого объекта (проверка наличия значения в наборе в среднем выполняется быстрее, чем поиск по массиву):

computed: {
  articleIds() {
    return new Set(this.articleArray.map(n => n.id));
  },
  ...

if (!this.articleIds.has(data.id)) {
  ...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы