propiedades - obtener id de un elemento javascript
¿Cómo cambiar un elemento en una matriz utilizando JavaScript? (6)
Mira esta respuesta de pregunta similar.
Código:
function toggle(collection, item) {
var idx = collection.indexOf(item);
if(idx !== -1) {
collection.splice(idx, 1);
} else {
collection.push(item);
}
}
Aquí está mi código para javascript para esta tarea simple:
- Eliminar el elemento si existe en una matriz.
Agregue el elemento si no está en una matriz.
if(_.contains(this.types,type_id)){ var index = this.types.indexOf(type_id); this.types.splice(index,1); } else{ this.types.push(type_id); }
¿Hay una manera más eficiente de hacer esto?
Para estado inmutable (matriz de clonación):
addOrRemove = (array, item) => {
const include = state.selectedLayersIds.include(item);
return include ? array.filter(arrayItem => arrayItem !== item : [ ...array, item ]);
}
Podría hacerlo sin una biblioteca de terceros, esto sería más eficiente, como esto. (Esto solo elimina la primera instancia de un valor si se encuentra, no múltiple)
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);
Salida
[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]
En jsfiddle
Puedes usar la función lodash "xor":
_.xor([2, 1], [2, 3]);
// => [1, 3]
Si no tiene una matriz como segundo parámetro, puede simplemente envolver la variable en una matriz
var variableToInsertOrRemove = 2;
_.xor([2, 1], [variableToInsertOrRemove]);
// => [1]
_.xor([1, 3], [variableToInsertOrRemove]);
// => [1, 2, 3]
Aquí está el documento: https://lodash.com/docs/4.16.4#xor
Si te preocupa la eficiencia, entonces es posible que el uso de una matriz para implementar un conjunto sea una mala idea. Por ejemplo, usando un objeto que podrías hacer:
function toggle(S, x) {
S[x] = 1 - (S[x]|0);
}
luego, después de muchas operaciones de agregar / eliminar, puede mantener solo las claves donde el valor es 1
De esta manera, cada adición / eliminación es O(1)
y solo necesita una operación O(n)
para obtener el resultado final.
Si las claves son todas "pequeñas", los números pueden ser una máscara de bits, incluso vale la pena el esfuerzo (no probado)
function toggle(S, x) {
var i = x >> 4;
S[i] = (S[i]|0) ^ (1<<(x&15));
}
Usando underscorejs
function toggle(a,b)
{
return _.indexOf(a,b)==-1?_.union(a,[b]):_.without(a,b);
}
Uso:
var a = [1,2,3];
var b = [4];
a = toggle(a,b); // [1,2,3,4]
a = toggle(a,b); // [1,2,3]