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
我刚刚在主干应用程序中用普通构建替换了下划线构建,并且该应用程序仍在工作。因此,我现在可以使用Lodash.clone来实现预期的行为


编辑2018:下划线构建。如果您在2018年阅读此文章,您可能会对(主干和Lodash)感兴趣。

您确定调用的是克隆的Lodash版本,而不是下划线版本吗?如果我先添加lodash.js,然后再添加下划线.js,我会得到与您描述的相同的行为。如果我使用问题中的代码并将lodash指定给
\uuu
,我无法重现问题中所述的问题。(也就是说,
.clone
isDeep
设置为
true
可以按预期工作。)Gruff Bunny的假设很好。我相信还有一种方法可以使用lodash作为下划线.js的替代品。我希望这样使用lodash不会执行深度复制,因为underline.js不会执行深度复制。是否同时使用下划线和lodash?不,lodash会替换下划线。