Учитывая объект:
var firstObject = {
key1 : 'value1',
key2 : 'value2'
};
Как я могу скопировать свойства внутри другого объекта ( secondObject
), как это:
var secondObject = {
key1 : 'value1',
key2 : 'value2',
key3 : 'value3',
key4 : 'value4'
};
используя ссылку на firstObject
? Что-то вроде этого:
var secondObject = {
firstObject,
key3 : 'value3',
key4 : 'value4'
};
(это не работает ... Я просто хочу показать большими линиями, как я хотел бы структурировать код).
Возможно ли решение без использования JavaScript-фреймворков?
javascript
Игорь Попов
источник
источник
secondObject = JSON.parse('{' + JSON.stringify(firstObject).match(/^.(.*).$/)[1] + ',' + JSON.stringify(secondObject).match(/^.(.*).$/)[1] + '}');
Ответы:
источник
hasOwnProperty
бесполезно. Хотя я нахожу ваш указатель полезным, я считаю идею применения любых правил к любой ситуации вредной и неразумной. Как и все эти практики разработки, основанные на шаблонах, так что не воспринимайте это как личность ...hasOwnProperty()
тест, и все вроде как работает. Пока они не остановятся, потому что ваши объекты со временем стали более сложными. За исключением этого, он таинственным образом ломается в несвязанной части кода, потому что слишком много было скопировано. И у вас нет контекста для отладки. JS такой отстой, поэтому осторожное кодирование, чтобы предотвратить возникновение таких проблем, является благоразумным.Пользуясь ответом @ Bardzuśny здесь, ES6 предоставила собственное решение:
Object.assign()
функцию!Использование простое:
Это оно!
Поддержка сейчас явно плохая; только Firefox (34+) поддерживает его "из коробки", в то время как Chrome (45+) и Opera (32+) требуют установки «экспериментального флага».Поддержка улучшается, и ее поддерживают последние версии Chrome, Firefox, Opera, Safari и Edge (IE, в частности, не имеет поддержки). Также доступны транспортеры, такие как Babel и Traceur. Смотрите здесь для более подробной информации.
источник
Object.assign()
shim: github.com/ljharb/object.assign ).Согласно ES6 - Синтаксис распространения :
Вы можете просто использовать:
Это позволяет избежать проблем передачи этих объектов по ссылке.
Кроме того, он заботится об объектах, которые имеют глубокое вложение.
источник
Просмотрите свойства первого объекта и назначьте их второму объекту, например так:
for
-in
петля не достаточно; вам нужноhasOwnProperty
. См. Http://bonsaiden.github.com/JavaScript-Garden/#object.forinloop для подробного объяснения причин.источник
reference
технический смысл. Я думаю, что он просто имеет в виду естественный язык «ссылаясь на».Здесь играют некроманта, потому что ES5 принес нам
Object.keys()
, с потенциалом, чтобы спасти нас от всех этих.hasOwnProperty()
проверок.Или, оборачивая это в функцию (ограниченная «копия» lodash
_.assign()
):Object.keys()
это относительно новый метод, в частности: недоступен в IE <9. То же самое на самом деле касается.forEach()
метода массива, который я использовал вместо обычногоfor
цикла.К счастью, есть ES5-прокладка для этих древних браузеров, которые будут polyfill много возможностей ES5 ( в том числе два).
(Я полностью за полифиллы, а не за то, чтобы не использовать классные новые языковые функции.)
источник
Это необходимо, чтобы люди могли найти метод глубокого копирования с hasOwnProperty и фактической проверкой объекта:
источник
'[object Array]'
Можно использовать Object.assign для объединения объектов. Он объединяет и переопределяет общее свойство справа налево, т. Е. То же свойство слева будет переопределено справа.
И важно предоставить пустой объект первым, чтобы избежать мутации исходных объектов. Исходные объекты должны оставаться чистыми, так как
Object.assign()
сам по себе возвращает новый объект.Надеюсь это поможет!
источник
Улучшение идеи kingPuppy и идеи OP (мелкая копия) - я добавляю только 3 точки к OP-примеру :)
Показать фрагмент кода
источник
Это должно работать, проверено здесь .
Примечание . Это не приведет к копированию методов
firstObject
примечания 2 : для использования в более старых браузерах вам потребуется анализатор json.
Примечание 3 : назначение по ссылке является жизнеспособным вариантом, особенно если он
firstObject
содержит методы. Скорректировал данный пример jsfiddle соответственноисточник
К сожалению, вы не можете поместить ссылку на переменную в подобный объект. Однако вы можете создать функцию, которая копирует значения объекта в другой объект.
источник
Если вы хотите получить только те свойства, которые существуют во втором объекте, вы можете использовать,
Object.keys
чтобы получить свойства первого объекта, вы можете сделать два метода:A.)
map
назначить свойства первого объекта второму объекту, используя побочные эффекты:Б.) или
reduce
создать новый объект и назначить его второму объекту. Имейте в виду, что этот метод заменяет другие свойства, которые второй объект мог иметь до того, который не соответствовал первому объекту:источник
Используйте нотацию распространения собственности. Он был добавлен в ES2018 (распространение для массивов / итераций было ранее, ES2015), {... firstObject} распространяет все перечисляемые свойства как дискретные свойства.
источник
Я бы предпочел использовать firstObject в качестве прототипа secondObject и добавить дескриптор свойства:
Это, конечно, не одна строка, но это дает вам больше контроля. Если вас интересуют дескрипторы свойств, я предлагаю прочитать эту статью: http://patrickdelancy.com/2012/09/property-descriptors-in-javascript/#comment-2062 и страницу MDN https: //developer.mozilla. орг / EN-US / Docs / Web / JavaScript / Справка / Global_Objects / Объект / создать
Вы также можете просто присвоить значения и опустить дескрипторы и сделать его немного короче:
Совместимость: ECMAScript 5, поэтому IE9 +
источник
Использование следующего метода скопирует свойства
Я очень новичок в JavaScript, но нашел, что это работает. Наверное, слишком долго, но это работает.
источник