我试图在一个promise中克隆一个对象并迭代它的一个属性。
这似乎有效,你会得到一个对象数组,其中page_num
从2增加到44。
var allOptions = _.map(_.range(2, 45), function(page){
return { body: { action: 'read', page_num: page, page_size: 5 }}
})
Promise.map(allOptions, function(options){
return Promise.resolve(options).delay(3000)
}).then(console.log)
但是上面这个例子每次都是从头开始创建一个对象。
当我尝试克隆现有对象时,我会得到下面描述的行为。
var masterOptions = { body: { action: 'read', page_num: 1, page_size: 5 }}
var allOptions = _.map(_.range(2, 45), function(page){
var options = _.clone(masterOptions)
options.body.page_num = page
return options
})
Promise.map(allOptions, function(options){
return Promise.resolve(options).delay(3000)
}).then(console.log)
或
Promise.map(_.range(2, 45), function(page){
var options = _.clone(masterOptions)
options.body.page_num = page
return Promise.resolve(options).delay(3000)
}).then(console.log)
这些似乎不起作用,选项对象似乎在每次迭代时迭代最后生成的对象{ body: { action: 'read', page_num: 44, page_size: 5 } }
。
如何克隆对象并迭代其中一个属性?
答案 0 :(得分:1)
是的,你是对的,下划线的clone
功能不是深。
这意味着您要克隆的对象的每个属性都是新变量,但该变量只会通过复制相应原件的内容来填充之一。
Underscore's clone
function (link)的文档中实际提到了这一点。这就是所说的:
创建提供的 plain 对象的浅层复制克隆。任何嵌套 对象或数组将通过引用复制,而不是重复。
所以,正如您猜测的那样,现在似乎下划线中没有开箱即用的深层复制功能。正如您在评论中提到的那样使用cloneDeep确实可以解决您的问题:)