我尝试使用嵌套对象克隆对象数组。
就像是:
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'
感谢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应用程序中将Underscore构建替换为Normal构建,并且该应用程序仍在工作。因此,我现在可以将Lodash .clone与预期的行为一起使用。
编辑2018: Underscore构建似乎不再存在。如果您在2018年阅读此书,则可能对本文档(Backbone和Lodash)感兴趣。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句