Поведение Lodash.clone и .cloneDeep
Контекст
Я пытаюсь клонировать массив объектов с вложенными объектами.
Что-то вроде:
var data = [
{ id: 1, values: { a: 'a', b: 'b' } },
{ id: 2, values: { c: 'c', d: 'd' } }
];
_. Клон
С помощью _.clone
и параметра isDeep
в true
:
var clone = _.clone(data, true);
data[1].values.d = 'x';
console.log( _.isEqual(data, clone) ); // true, clone[1].values.d == 'x'
Я ожидал clone[1].values.d == 'd'
:
Если isDeep - это истинные вложенные объекты, также будут клонированы, иначе они будет присвоено по ссылке.
Что не так?
_. CloneDeep
Кроме того, когда я пытаюсь использовать метод _.cloneDeep
, я получаю сообщение об ошибке:
var clone = _.cloneDeep(data);
// Uncaught TypeError: Object function u(n){return n instanceof u?n:new o(n)}
// has no method 'cloneDeep'
Почему эта ошибка?
$. Простираться
С $.extend
клон не имеет ссылки на исходный объект, как ожидалось:
var clone = $.extend(true, {}, data);
console.log( _.isEqual(data, clone) ); // false, clone[1].values.d == 'd'
Ответы
Ответ 1
Спасибо Gruff Bunny и Louis, которые помогли мне с их комментариями.
Фактически, когда я использую Backbone.js, я загрузил Lodash Underscore build, который отключает некоторые функции:
var clone = _.clone(data, true);
data[1].values.d = 'x';
console.log( _.isEqual(data, clone) , data , clone );
В описании говорится:
Подстрока подстроки (включает в себя сборку Backbone, которая является подмножеством Подчеркивание)
Я точно не знаю, что это значит.
Я просто изменил сборку Underscore с помощью стандартной сборки в мое приложение Backbone, и приложение все еще работает. Поэтому я могу использовать Lodash.clone с ожидаемым поведением.