Каков наилучший способ клонирования объекта в node.js
например, я хочу избежать ситуации, когда:
var obj1 = {x: 5, y:5};
var obj2 = obj1;
obj2.x = 6;
console.log(obj1.x); // logs 6
Объект может содержать сложные типы в качестве атрибутов, поэтому простое for (var x в obj1) не решит проблему. Нужно ли мне самому писать рекурсивный клон или есть что-то встроенное, чего я не вижу?
javascript
node.js
slifty
источник
источник
npm install underscore
2.var _ = require('underscore')
3_.clone(objToClone)
.;Ответы:
Возможность 1
Низкая навороченная глубокая копия:
Возможность 2 (не рекомендуется)
Внимание: это решение теперь помечено как устаревшее в документации по Node.js :
Оригинальный ответ: ::
Для мелкой копии используйте встроенную
util._extend()
функцию Node .Исходный код функции Node
_extend
находится здесь: https://github.com/joyent/node/blob/master/lib/util.jsисточник
_*
должно означать, что это частный метод и на него нельзя полагаться?util._extend()
Object.assign().
Я удивлен,
Object.assign
что не было упомянуто.Если доступно (например, Babel), вы можете использовать оператор распространения объекта :
источник
Это определит метод расширения, который вы можете использовать. Код взят из этой статьи.
источник
источник
Object.keys()
для перебора объектаВы можете использовать функцию расширения из JQuery:
Также есть плагин Node.js:
https://github.com/shimondoodkin/nodejs-clone-extend
Чтобы сделать это без JQuery или плагина, прочитайте это здесь:
http://my.opera.com/GreyWyvern/blog/show.dml/1725165
источник
Проверьте underscore.js . У этого есть и клон и расширение и много других очень полезных функций.
Это может быть полезно: Использование модуля Underscore с Node.js
источник
Есть некоторые Node-модули, если вы не хотите «свернуть свои собственные». Это выглядит хорошо: https://www.npmjs.com/package/clone
Похоже, он обрабатывает все виды вещей, в том числе круговые ссылки. Со страницы GitHub :
источник
Этот код также работает, потому что метод Object.create () создает новый объект с указанным объектом-прототипом и свойствами.
источник
Самый простой и быстрый способ клонировать объект в NodeJS - это использовать метод Object.keys (obj)
Метод Object.keys требует JavaScript 1.8.5; nodeJS v0.4.11 поддерживает этот метод
но конечно для вложенных объектов нужно реализовать рекурсивную функцию
Другое решение - использовать нативный JSON (реализован в JavaScript 1.7), но он намного медленнее (примерно в 10 раз медленнее, чем предыдущий).
источник
Существует также проект на Github, который направлен на то, чтобы стать более прямым портом
jQuery.extend()
:https://github.com/dreamerslab/node.extend
Пример, модифицированный из документов jQuery :
источник
Есть еще одна библиотека lodash , в ней есть clone и cloneDeep , а также множество других полезных функций.
источник
Вы все страдаете, но решение простое.
var obj2 = {...obj1};
// Бумисточник
В поисках истинного варианта клонирования, я наткнулся на ссылку Ридкулли здесь:
http://my.opera.com/GreyWyvern/blog/show.dml/1725165
Я изменил решение на этой странице, чтобы функция, присоединенная к
Object
прототипу, не была перечисляемой. Вот мой результат:Надеюсь, это поможет кому-то еще. Обратите внимание, что есть некоторые предостережения ... особенно со свойствами под названием "клон". Это хорошо работает для меня. Я не возьму на себя ответственность за написание этого. Опять же, я только изменил, как это было определено.
источник
Вы также можете использовать SugarJS в NodeJS.
http://sugarjs.com/
У них есть очень чистая функция клонирования: http://sugarjs.com/api/Object/clone
источник
Если вы используете кофе-скрипт, это так же просто, как:
Хотя это не глубокий клон.
источник
Ни один из ответов не удовлетворил меня, некоторые не работают или являются просто клонами, ответы от @ clint-harris и использования JSON.parse / stringify хорошие, но довольно медленные. Я нашел модуль, который быстро выполняет глубокое клонирование: https://github.com/AlexeyKupershtokh/node-v8-clone
источник
Нет встроенного способа сделать реальный клон (глубокое копирование) объекта в node.js. Есть некоторые сложные случаи, поэтому вам обязательно нужно использовать библиотеку для этого. Я написал такую функцию для моей библиотеки simpleoo . Вы можете использовать
deepCopy
функцию, не используя ничего из библиотеки (которая довольно мала), если вам это не нужно. Эта функция поддерживает клонирование нескольких типов данных, включая массивы, даты и регулярные выражения, поддерживает рекурсивные ссылки, а также работает с объектами, функции конструктора которых имеют требуемые параметры.Вот код:
источник
Самый быстрый клонер, он открывает нативный метод клонирования из node.js
источник
Другое решение заключается в инкапсуляции непосредственно в новую переменную с использованием:
obj1= {...obj2}
источник
Вы также можете использовать эту библиотеку клонов для глубокого клонирования объектов.
источник
Вы можете создать прототип объекта, а затем вызывать экземпляр объекта каждый раз, когда захотите использовать и изменить объект:
Вы также можете передать аргументы в конструктор объекта
Надеюсь, это полезно.
источник