var listToDelete = ['abc', 'efg'];
var arrayOfObjects = [{id:'abc',name:'oh'}, // delete me
{id:'efg',name:'em'}, // delete me
{id:'hij',name:'ge'}] // all that should remain
¿Cómo elimino un objeto de la matriz haciendo coincidir la propiedad del objeto?
Solo JavaScript nativo por favor.
Tengo problemas para usar el empalme porque la longitud disminuye con cada eliminación. El uso de clones y empalmes en el índice original todavía te deja con el problema de la disminución de la longitud.
javascript
Dan Kanze
fuente
fuente
Respuestas:
¿Supongo que usaste
splice
algo como esto?Todo lo que necesita hacer para corregir el error es disminuir
i
la próxima vez (y hacer un bucle hacia atrás también es una opción):Para evitar eliminaciones en tiempo lineal, puede escribir elementos de matriz que desee mantener sobre la matriz:
y para evitar búsquedas de tiempo lineal en un tiempo de ejecución moderno, puede usar un conjunto de hash:
que se puede envolver en una buena función:
Si no necesita hacerlo en su lugar, eso es
Array#filter
:fuente
Puede eliminar un elemento por una de sus propiedades sin usar ninguna biblioteca de terceros como esta:
fuente
Con lodash / subrayado:
Si desea modificar la matriz existente en sí, entonces tenemos que usar el empalme . Aquí está la forma un poco mejor / legible usando findWhere de subrayado / lodash:
Con ES5 o superior
( sin lodash / subrayado )
Con ES5 en adelante, tenemos un
findIndex
método en matriz, por lo que es fácil sin lodash / subrayado(ES5 es compatible con casi todos los navegadores modernos)
Acerca de findIndex y su compatibilidad con el navegador
fuente
items.splice(items.findIndex(i => i.id === "abc"), 1)
findIndex funciona para navegadores modernos:
fuente
Para eliminar un objeto por su id en una matriz dada;
fuente
Si solo desea eliminarlo de la matriz existente y no crear uno nuevo, intente:
fuente
Haga un bucle inverso al disminuir
i
para evitar el problema:O use
filter
:fuente
Mira esto usando Set y el filtro ES6.
Aquí está JsFiddle: https://jsfiddle.net/jsq0a0p1/1/
fuente
Como alternativa, una solución más "funcional", trabajando en ECMAScript 5, puede usar:
De acuerdo con la definición de 'Array.prototype.reduceRight' en ECMA-262 :
Entonces este es un uso válido de
reduceRight
.fuente
según su respuesta será así. Cuando hace clic en algún objeto en particular, envíe el índice en el parámetro para la función Eliminarme. Este código simple funcionará como encanto.
fuente
con filtro e index
con filtro e incluye
fuente
Si le gustan los parámetros breves y autodescriptivos o si no desea usar
splice
e ir con un filtro directo o si simplemente es una persona SQL como yo:Y una muestra de uso:
fuente
Puedes usar
filter
. Este método siempre devuelve el elemento si la condición es verdadera. Entonces, si desea eliminar por identificación, debe mantener todo el elemento que no coincida con la identificación dada. Aquí hay un ejemplo:fuente