我尝试使用嵌套对象克隆一个对象数组。
类似的东西:
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为true,嵌套对象也将被克隆,否则它们将被克隆 将通过引用分配。
有什么问题?
此外,当我尝试使用_.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'
答案 0 :(得分:21)
感谢Gruff Bunny和Louis的评论,我找到了问题的根源。
当我使用Backbone.js时,我加载了一个与Backbone和Underscore兼容的Lodash特殊版本,可以禁用某些功能。在这个例子中:
var clone = _.clone(data, true);
data[1].values.d = 'x';
_.isEqual(data, clone) === false
_.isEqual(data, clone) === true
我刚用Backbone应用程序中的Normal版本替换了Underscore版本,应用程序仍在运行。所以我现在可以使用具有预期行为的Lodash .clone。
编辑2018: Underscore版本doesn't seem to exist anymore。如果您在2018年阅读此内容,可能会对this documentation(Backbone和Lodash)感兴趣。