¿Cuál es la mejor / forma estándar de fusionar dos matrices asociativas en JavaScript? ¿Todos lo hacen rodando su propio for
bucle?
javascript
object
Wilhelm
fuente
fuente
Respuestas:
con jquery puedes llamar
$.extend
(las matrices asociadas son objetos en js)
mira aquí: http://api.jquery.com/jQuery.extend/
editar: como sugirió rymo, es mejor hacerlo de esta manera:
Como aquí, obj1 (y obj2) permanecen sin cambios.
edit2: en 2018 la forma de hacerlo es a través de
Object.assign
:Si trabaja con ES6, esto se puede lograr con el Operador de propagación :
fuente
obj1
, utilice un objeto vacío como objetivo:$.extend({}, obj1, obj2)
Object.assign()
, que no depende de JQuery si aún no está usando la biblioteca.Ahora, en 2016, diría que la mejor / estándar es Object.assign ()
Pure Javascript. No se necesita jQuery.
Más información, ejemplos y polyfill aquí:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
fuente
Así es como Prototype lo hace:
llamado como, por ejemplo:
EDITAR : se ha agregado la verificación hasOwnProperty () como lo señala correctamente bucabay en los comentarios
fuente
Mantenlo simple...
fuente
arrau1.prototype
hasOwnProperty
cheque. Hacer referencia a los objetos como matrices también es engañoso (son objetos), los nombres arg deben transmitir que la matriz2 está mutada o que se debe devolver un nuevo objeto. Editaría la respuesta, pero en efecto se convertiría casi exactamente en la respuesta editada de Jonathan Fingland que ya se ha corregido.El subrayado también tiene un método extendido:
fuente
En dojo , la combinación de 2 objetos / matrices sería
lang.mixin(destination, source)
: también puede mezclar múltiples fuentes en un destino, etc., consulte la referencia de la función mixin para obtener más detalles.fuente
¿Desea sobrescribir una propiedad si los nombres son iguales pero los valores no lo son?
¿Y desea cambiar permanentemente uno de los objetos originales,
o quieres que se devuelva un nuevo objeto combinado?
fuente
Rolling Your Own Extend / Mixin Function
...
...
Esto simplemente se extiende un splat de objetos, de forma recursiva. Además, tenga en cuenta que esta función recursiva es TCO ( Tail-Call Optimized ) ya que su retorno es la última llamada a sí mismo.
Además, es posible que desee propiedades específicas . En este caso, es posible que desee para condensar los objetos basados en
id
,quantity
o de otra propiedad. Este enfoque podría tener un pequeño libro escrito sobre él y requiere yuxtaposición de objetos y puede volverse muy complejo. He escrito una pequeña biblioteca para esto que está disponible a pedido.¡Espero que esto ayude!
fuente
fuente
En 2019 tienes 2 buenas opciones:
Asignación de objeto [ doc ]
Difusión de objetos [ doc ]
El primero tiende a ser más seguro, más estándar y polivalente. Un buen pros y contras aquí
fuente
Yahoo UI (YUI) también tiene una función auxiliar para esto:
http://developer.yahoo.com/yui/examples/yahoo/yahoo_merge.html
fuente
jquery tiene un booleano para copia profunda. Podrías hacer algo así:
También puede editar esta función para admitir n-arrays para fusionar.
Entonces ahora puedes hacer
fuente
Necesitaba una fusión profunda de objetos. Así que todas las otras respuestas no me ayudaron mucho. _.extend y jQuery.extend funcionan bien, a menos que tenga una matriz recursiva como yo. Pero no es tan malo, puedes programarlo en cinco minutos:
fuente
Para fusionar matrices en jQuery, ¿qué pasa con $ .merge?
fuente
Solución recursiva (se extiende también matrices de objetos) + nulo verificado
Pruebas
fuente
Object.getOwnPropertyNames is not a function
bloqueare la aplicación.Aquí está la mejor solución.
Además,
obj1
puede crecer dentro de un bucle sin ningún problema. (digamos queobj2
es dinámico)fuente