Javascript Lodash.clone和.cloneDeep行为
我尝试克隆具有嵌套对象的对象数组 比如:Javascript Lodash.clone和.cloneDeep行为,javascript,jquery,backbone.js,underscore.js,lodash,Javascript,Jquery,Backbone.js,Underscore.js,Lodash,我尝试克隆具有嵌套对象的对象数组 比如: var data = [ { id: 1, values: { a: 'a', b: 'b' } }, { id: 2, values: { c: 'c', d: 'd' } } ]; _.克隆 在true处使用方法和isDeep参数: var clone = _.clone(data, true); data[1].values.d = 'x'; console.log( _.isEqual(data, clone) ); //
var data = [
{ id: 1, values: { a: 'a', b: 'b' } },
{ id: 2, values: { c: 'c', d: 'd' } }
];
_.克隆
在true
处使用方法和isDeep
参数:
var clone = _.clone(data, true);
data[1].values.d = 'x';
console.log( _.isEqual(data, clone) ); // true, clone[1].values.d == 'x'
我希望克隆[1]。value.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'
为什么会出现这种错误
$扩展
如果克隆未按预期引用原始对象:
var clone = $.extend(true, {}, data);
console.log( _.isEqual(data, clone) ); // false, clone[1].values.d == 'd'
多亏了粗暴的兔子和路易斯的评论,我找到了问题的根源 由于我也使用Backbone.js,我加载了一个与Backbone和下划线兼容的Lodash的特殊版本,该版本禁用了一些功能。在本例中:
var clone = _.clone(data, true);
data[1].values.d = 'x';
- :
\ isEqual(数据,克隆)==false
- :
\ isEqual(数据,克隆)==true
编辑2018:下划线构建。如果您在2018年阅读此文章,您可能会对(主干和Lodash)感兴趣。您确定调用的是克隆的Lodash版本,而不是下划线版本吗?如果我先添加lodash.js,然后再添加下划线.js,我会得到与您描述的相同的行为。如果我使用问题中的代码并将lodash指定给
\uuu
,我无法重现问题中所述的问题。(也就是说,.clone
将isDeep
设置为true
可以按预期工作。)Gruff Bunny的假设很好。我相信还有一种方法可以使用lodash作为下划线.js的替代品。我希望这样使用lodash不会执行深度复制,因为underline.js不会执行深度复制。是否同时使用下划线和lodash?不,lodash会替换下划线。