如何克隆对象并迭代其中一个属性?

时间:2015-06-29 19:15:52

标签: javascript object promise clone bluebird

我试图在一个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 } }

如何克隆对象并迭代其中一个属性?

1 个答案:

答案 0 :(得分:1)

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

这意味着您要克隆的对象的每个属性都是变量,但该变量只会通过复制相应原件的内容来填充之一。

Underscore's clone function (link)的文档中实际提到了这一点。这就是所说的:

  

创建提供的 plain 对象的浅层复制克隆。任何嵌套   对象或数组将通过引用复制,而不是重复。

所以,正如您猜测的那样,现在似乎下划线中没有开箱即用的深层复制功能。正如您在评论中提到的那样使用cloneDeep确实可以解决您的问题:)