Ответ 1
Да, его небольшая ошибка
if(this.items.indexOf(item) === -1) {
this.items.push(item);
console.log(this.items);
}
У меня есть простой случай нажатия уникальных значений в массив. Это выглядит так:
this.items = [];
add(item) {
if(this.items.indexOf(item) > -1) {
this.items.push(item);
console.log(this.items);
}
}
Кажется довольно прямолинейным, не так ли? Нет, как кажется. Он не добавляет никаких значений. Я уверен, что это какая-то глупая ошибка на моей стороне, но я не могу ее найти.
Да, его небольшая ошибка
if(this.items.indexOf(item) === -1) {
this.items.push(item);
console.log(this.items);
}
Вы можете использовать структуру Set из ES6, чтобы сделать ваш код быстрее и более читабельным:
// Create Set
this.items = new Set();
add(item) {
this.items.add(item);
// Set to array
console.log([...this.items]);
}
Я думаю, ES6 установил структуру данных, которую вы можете использовать для уникальных записей
В вашей логике говорится: "Если этот элемент уже существует, то добавьте его". Это должно быть противоположно этому.
Измените его на...
if (this.items.indexOf(item) == -1) {
this.items.push(item);
}
Вы должны использовать == -1, если равно -1 doest не содержится в вашем массиве
this.items = [];
add(item) {
if(this.items.indexOf(item) == -1) {
this.items.push(item);
console.log(this.items);
}
}
поэтому не уверен, что это отвечает на ваш вопрос, но 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);
Если вы используете Lodash, посмотрите на функцию _.union
:
let items = [];
items = _.union([item], items)
var helper = {};
for(var i = 0; i < data.length; i++){
helper[data[i]] = 1; // Fill object
}
var result = Object.keys(helper); // Unique items
попробуйте .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);
однако обратите внимание на совместимость браузера внизу страницы.