Какой лучший / стандартный способ объединения двух ассоциативных массивов в JavaScript? Все просто делают это, вращая свой собственный for
цикл?
javascript
object
Вильгельм
источник
источник
Ответы:
с JQuery вы можете позвонить
$.extend
(ассоциированные массивы - это объекты в js)
смотрите здесь: http://api.jquery.com/jQuery.extend/
редактировать: как предложено rymo, лучше сделать это следующим образом:
Поскольку здесь obj1 (и obj2) остаются без изменений.
edit2: в 2018 году способ сделать это через
Object.assign
:При работе с ES6 этого можно достичь с помощью оператора Spread :
источник
obj1
, используйте пустой объект в качестве цели:$.extend({}, obj1, obj2)
Object.assign()
, который не полагается на JQuery, если вы еще не используете библиотеку.Сейчас, в 2016 году, я бы сказал, что лучшим / стандартным способом является Object.assign ()
Pure Javascript. Нет JQuery не требуется.
Больше информации, примеров и полифилла здесь:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
источник
Вот как это делает Prototype:
называется как, например:
РЕДАКТИРОВАТЬ : добавлена проверка hasOwnProperty (), правильно указанная bucabay в комментариях
источник
Будь проще...
источник
arrau1.prototype
hasOwnProperty
чек. Обращение к объектам как к массивам также вводит в заблуждение (они являются объектами), имена аргументов должны указывать на то, что массив2 мутирован или должен быть возвращен новый объект. Я бы отредактировал ответ, но фактически он стал бы почти точно отредактированным ответом Джонатана Фингланда, который уже был исправлен.У подчеркивания также есть метод расширения:
источник
В dojo 2-объекты / массивы «объединяются»
lang.mixin(destination, source)
- вы также можете смешивать несколько источников в одном месте назначения и т. Д. - подробности см. В справочнике функции mixin .источник
Вы хотите перезаписать свойство, если имена совпадают, а значения не совпадают?
И вы хотите навсегда изменить один из оригинальных объектов,
или вы хотите вернуть новый объединенный объект?
источник
Прокручиваем собственную функцию расширения / микширования
...
...
Это просто расширяет восклицательный знак объектов, рекурсивно. Кроме того, обратите внимание, что эта рекурсивная функция является TCO ( Tail-Call Optimized ), поскольку ее возвращение является последним вызовом к себе.
Кроме того, вы можете захотеть целевые свойства . В этом случае, вы можете конденсироваться объектами , основанных на
id
,quantity
или другое имущество. При таком подходе может быть написана небольшая книга, которая требует сопоставления объектов и может быть очень сложной. Я написал небольшую библиотеку для этого, которая доступна по запросу.Надеюсь это поможет!
источник
источник
В 2019 году у вас есть 2 хороших варианта:
Назначение объекта [ doc ]
Распространение объектов [ doc ]
Первый имеет тенденцию быть более безопасным, более стандартным и поливалентным. Хорошие плюсы и минусы здесь
источник
Yahoo UI (YUI) также имеет вспомогательную функцию для этого:
http://developer.yahoo.com/yui/examples/yahoo/yahoo_merge.html
источник
JQuery имеет логическое значение для глубокого копирования. Вы могли бы сделать что-то подобное:
Также вы можете редактировать эту функцию для поддержки объединения n-массивов.
Так что теперь вы можете сделать
источник
Мне нужно было глубокое слияние объектов. Так что все остальные ответы мне не очень помогли. _.extend и jQuery.extend работают хорошо, если у вас нет рекурсивного массива, как у меня. Но все не так плохо, вы можете запрограммировать его за пять минут:
источник
Чтобы объединить массивы в jQuery, а как насчет $ .merge?
источник
Рекурсивное решение (расширяет также массивы объектов) + проверено ноль
тесты
источник
Object.getOwnPropertyNames is not a function
произойдет сбой приложения.Вот лучшее решение.
Кроме того,
obj1
может расти внутри цикла без каких-либо проблем. (скажемobj2
, динамический)источник