Estoy buscando una forma eficiente de eliminar todos los elementos de una matriz de JavaScript si están presentes en otra matriz.
// If I have this array:
var myArray = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
// and this one:
var toRemove = ['b', 'c', 'g'];
Quiero operar en myArray para dejarlo en este estado: ['a', 'd', 'e', 'f']
Con jQuery, estoy usando grep()
y inArray()
, que funciona bien:
myArray = $.grep(myArray, function(value) {
return $.inArray(value, toRemove) < 0;
});
¿Existe una manera pura de javascript para hacer esto sin bucles y empalmes?
javascript
arrays
Grifo
fuente
fuente
.filter()
. En su lugar, usarásfor
bucles. Puede evitar.splice()
si no es necesario mantener el pedido original. O bien, hay formas de hacerlo.splice()
más eficiente si cree que habrá muchos elementos para eliminar.Respuestas:
Usa el
Array.filter()
método:Pequeña mejora, ya que el soporte del navegador
Array.includes()
ha aumentado:Próxima adaptación usando las funciones de flecha :
fuente
.difference()
básicamente lo que hace esto.toRemove()
mayúsculas y cambie la devolución de llamada deel
ael.toUpperCase()
.myArray = myArray.filter( el => !toRemove.includes( el ) );
El
filter
método debería hacer el truco:Si su
toRemove
matriz es grande, este tipo de patrón de búsqueda puede ser ineficiente. Sería más eficiente crear un mapa para que las búsquedas seanO(1)
más queO(n)
.fuente
Si está utilizando una matriz de objetos. Luego, el siguiente código debe hacer la magia, donde una propiedad de objeto será el criterio para eliminar elementos duplicados.
En el siguiente ejemplo, se han eliminado los duplicados comparando el nombre de cada elemento.
Prueba este ejemplo. http://jsfiddle.net/deepak7641/zLj133rh/
fuente
Lodash también tiene una función de utilidad para esto: https://lodash.com/docs#difference
fuente
Los conjuntos ECMAScript 6 se pueden usar para calcular los diferentes elementos de dos matrices:
fuente
Acabo de implementar como:
Usar como:
fuente
prototypes
objetos nativos, por ejemploArray
. Eso puede tener un conflicto a largo plazo con el desarrollo futuro del lenguaje ( ver elflatten
caso )Si no puede usar cosas nuevas de ES5,
filter
creo que está atrapado con dos bucles:fuente
fuente
Ahora en sabor de una sola línea:
Puede que no funcione en navegadores antiguos.
fuente
Puedes usar _.differenceBy de lodash
Código de ejemplo aquí: CodePen
fuente
¿Qué tal el más simple posible:
fuente
includes
no está disponible antes de ES7.La forma correcta de eliminar todos los elementos contenidos en otra matriz es hacer que la matriz de origen sea el mismo objeto eliminando solo elementos:
O equivalente de CoffeeScript:
Prueba dentro de las herramientas de desarrollo de Chrome:
El uso del marco angular es la mejor manera de mantener el puntero al objeto de origen cuando actualiza colecciones sin una gran cantidad de observadores y recargas.
fuente
Construyo la lógica sin usar ningún método incorporado, por favor hágame saber cualquier optimización o modificación. Probé en el editor JS que funciona bien.
fuente