如何克隆一个对象并迭代它的一个属性?

4
我正在尝试在一个承诺内部克隆一个对象并迭代其属性。
这似乎是有效的,您将获得一个对象数组,在其中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 } }

我该如何克隆一个对象并遍历它的属性之一?


我相信我通过切换到lodash的cloneDeep来解决了这个问题。 - ThomasReggi
1
这与 Promises/Bluebird 有什么关系?使用 console.log(allOptions) 不是可以得到相同的结果吗? - Bergi
1个回答

1

是的,你说得对,Underscoreclone 函数不是深度复制

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

实际上,在 Underscoreclone 函数 (链接) 的文档中已经提到了这一点。这是它所说的:

创建所提供的普通对象的浅层副本。任何嵌套的对象或数组都将被引用复制,而不是重复复制。


因此,正如你所猜测的那样,目前在Underscore中似乎没有现成的深拷贝函数。像你在评论中提到的cloneDeep一样使用确实可以解决你的问题 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接