GG.*_*GG. 37 javascript jquery backbone.js underscore.js lodash
我尝试使用嵌套对象克隆一个对象数组.
就像是:
var data = [
{ id: 1, values: { a: 'a', b: 'b' } },
{ id: 2, values: { c: 'c', d: 'd' } }
];
Run Code Online (Sandbox Code Playgroud)
使用_.clone
方法和isDeep
参数true
:
var clone = _.clone(data, true);
data[1].values.d = 'x';
console.log( _.isEqual(data, clone) ); // true, clone[1].values.d == 'x'
Run Code Online (Sandbox Code Playgroud)
我期望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'
Run Code Online (Sandbox Code Playgroud)
为什么这个错误?
随着$.extend
克隆没有参照原对象的要求:
var clone = $.extend(true, {}, data);
console.log( _.isEqual(data, clone) ); // false, clone[1].values.d == 'd'
Run Code Online (Sandbox Code Playgroud)
GG.*_*GG. 24
感谢Gruff Bunny和路易斯的评论,我找到了问题的根源.
当我使用Backbone.js时,我加载了一个与Backbone和Underscore兼容的Lodash特殊版本,它禁用了一些功能.在这个例子中:
var clone = _.clone(data, true);
data[1].values.d = 'x';
Run Code Online (Sandbox Code Playgroud)
_.isEqual(data, clone) === false
_.isEqual(data, clone) === true
我刚用Backbone应用程序中的Normal build替换了Underscore构建,应用程序仍在运行.所以我现在可以使用具有预期行为的Lodash .clone.
编辑2018: Underscore构建似乎不再存在.如果您在2018年阅读本文,您可能会对此文档感兴趣(Backbone和Lodash).
归档时间: |
|
查看次数: |
125443 次 |
最近记录: |