Array.push() и уникальные предметы

У меня есть простой случай нажатия уникальных значений в массив. Это выглядит так:

  this.items = [];

  add(item) {
    if(this.items.indexOf(item) > -1) {
      this.items.push(item);
      console.log(this.items);
    }
  }

Кажется довольно прямолинейным, не так ли? Нет, как кажется. Он не добавляет никаких значений. Я уверен, что это какая-то глупая ошибка на моей стороне, но я не могу ее найти.

Ответ 1

Да, его небольшая ошибка

if(this.items.indexOf(item) === -1) {
      this.items.push(item);
      console.log(this.items);
    }

Ответ 2

Вы можете использовать структуру Set из ES6, чтобы сделать ваш код быстрее и более читабельным:

// Create Set
this.items = new Set();

add(item) {
    this.items.add(item);

    // Set to array
    console.log([...this.items]);
}

Ответ 3

Я думаю, ES6 установил структуру данных, которую вы можете использовать для уникальных записей

Ответ 4

В вашей логике говорится: "Если этот элемент уже существует, то добавьте его". Это должно быть противоположно этому.

Измените его на...

if (this.items.indexOf(item) == -1) {
    this.items.push(item);
}

Ответ 5

Вы должны использовать == -1, если равно -1 doest не содержится в вашем массиве

  this.items = [];

  add(item) {
    if(this.items.indexOf(item) == -1) {
      this.items.push(item);
      console.log(this.items);
    }
  }

Ответ 6

поэтому не уверен, что это отвечает на ваш вопрос, но indexOf добавляемые элементы сохраняют возврат -1. Не знакомы с js, но кажется, что элементы делают это, потому что они еще не находятся в массиве. Я сделал jsfiddle небольшого измененного кода для вас.

this.items = [];

add(1);
add(2);
add(3);

document.write("added items to array");
document.write("<br>");
function  add(item) {
        //document.write(this.items.indexOf(item));
    if(this.items.indexOf(item) <= -1) {

      this.items.push(item);
      //document.write("Hello World!");
    }
}

document.write("array is : " + this.items);

https://jsfiddle.net/jmpalmisano/Lnommkbw/2/

Ответ 7

Если вы используете Lodash, посмотрите на функцию _.union:

let items = [];
items = _.union([item], items)

Ответ 8

var helper = {};
for(var i = 0; i < data.length; i++){
  helper[data[i]] = 1; // Fill object
}
var result = Object.keys(helper); // Unique items

Ответ 9

попробуйте .include()

[1, 2, 3].includes(2);     // true
[1, 2, 3].includes(4);     // false
[1, 2, 3].includes(3, 3);  // false
[1, 2, 3].includes(3, -1); // true
[1, 2, NaN].includes(NaN); // true

так что-то вроде

const array = [1, 3];
if (!array.includes(2))
    array.push(2);

однако обратите внимание на совместимость браузера внизу страницы.