2015-06-29 28 views
4

我想克隆一个承诺内的对象,并迭代它的一个属性。如何克隆一个对象并遍历其中一个属性?

这似乎是工作,你会得到objest数组,其中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

我相信我通过切换到lodash的[cloneDeep](https://lodash.com/docs#cloneDeep)来解决这个问题。 – ThomasReggi

+1

这与promises/bluebird有什么关系?你不用'console.log(allOptions)'得到相同的行为吗? – Bergi

回答

1

是的,你说得对,下划线clone功能并不

这意味着你克隆将是一个新的变量对象的每个属性,但该变量将由复制相应的原始的内容简单地填充。

这实际上是在Underscore's clone function (link)的文档中提到的。这里是说:

创建提供平原对象的浅拷贝克隆。任何嵌套的 对象或数组将被引用复制,而不是重复。


所以,你猜到了,似乎没有在外的开箱深拷贝功能下划线现在。正如你在评论中提到的那样使用cloneDeep确实可以解决你的问题:)