Как переключить элемент в массиве с помощью JavaScript?
Вот мой код для javascript для этой простой задачи:
- Удалить элемент, если он существует в массиве.
-
Добавить элемент, если он не находится в массиве.
if(_.contains(this.types,type_id)){
var index = this.types.indexOf(type_id);
this.types.splice(index,1);
}
else{
this.types.push(type_id);
}
Есть ли более эффективный способ сделать это?
Ответы
Ответ 1
Если вы заботитесь об эффективности, возможно, использовать массив для реализации набора - это плохая идея. Например, используя объект, который вы могли бы сделать:
function toggle(S, x) {
S[x] = 1 - (S[x]|0);
}
то после многих операций добавления/удаления вы можете хранить только ключи, где значение равно 1
Таким образом, каждое добавление/удаление - O(1)
, и для получения окончательного результата требуется только одна операция O(n)
.
Если все ключи "маленькие" могут быть битовой маской, даже стоит усилий (не проверено)
function toggle(S, x) {
var i = x >> 4;
S[i] = (S[i]|0) ^ (1<<(x&15));
}
Ответ 2
Вы могли бы сделать это без сторонней библиотеки, это было бы более эффективно, как это. (это удаляет только первый экземпляр значения, если найдено, а не несколько)
Javascript
var a = [0, 1, 2, 3, 4, 6, 7, 8, 9],
b = 5,
c = 6;
function addOrRemove(array, value) {
var index = array.indexOf(value);
if (index === -1) {
array.push(value);
} else {
array.splice(index, 1);
}
}
console.log(a);
addOrRemove(a, b);
console.log(a);
addOrRemove(a, c);
console.log(a);
Выход
[0, 1, 2, 3, 4, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 6, 7, 8, 9, 5]
[0, 1, 2, 3, 4, 7, 8, 9, 5]
Вкл jsfiddle
Ответ 3
Вы можете использовать функцию lodash "xor":
_.xor([2, 1], [2, 3]);
// => [1, 3]
Если у вас нет массива в качестве второго параметра, вы можете просто переносить переменную в массив
var variableToInsertOrRemove = 2;
_.xor([2, 1], [variableToInsertOrRemove]);
// => [1]
_.xor([1, 3], [variableToInsertOrRemove]);
// => [1, 2, 3]
Здесь doc: https://lodash.com/docs/4.16.4#xor
Ответ 4
Для неизменяемого состояния (массив клонов):
const addOrRemove = (arr, item) => arr.includes(item) ? arr.filter(i => i !== item) : [ ...arr, item ];
Ответ 5
Посмотрите на этот ответ на аналогичный вопрос.
Лодаш выпуск
Лодаш Гист
Код:
function toggle(collection, item) {
var idx = collection.indexOf(item);
if(idx !== -1) {
collection.splice(idx, 1);
} else {
collection.push(item);
}
}
Ответ 6
Использование underscorejs
function toggle(a,b)
{
return _.indexOf(a,b)==-1?_.union(a,[b]):_.without(a,b);
}
Использование:
var a = [1,2,3];
var b = [4];
a = toggle(a,b); // [1,2,3,4]
a = toggle(a,b); // [1,2,3]
Ответ 7
Если "типы" могут быть множеством, тогда
let toggle = type_id => this.types.delete(type_id) || this.types.add(type_id);
Ответ 8
Расширение ответа Xotic750 это всегда гарантирует, что переключаемые элементы встречаются только один раз в массиве. Вы делаете это, если ваши массивы немного случайны, как пользовательский ввод.
function toggleValueInArray(array, value) {
var index = array.indexOf(value);
if (index == -1) {
array.push(value);
} else {
do {
array.splice(index, 1);
index = array.indexOf(value);
} while (index != -1);
}
}
var a = [0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9],
b = 5,
c = 10;
// toString just for good output
console.log(a.toString());
toggleValueInArray(a, b);
console.log(a.toString());
toggleValueInArray(a, c);
console.log(a.toString());