我怎样才能克隆一个对象并迭代它的一个属性?

How can I clone an object and iterate over one of it's properties?

我正在尝试在 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 } }

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

是的,你是对的,Underscoreclone 函数不是 deep

这意味着您要克隆的对象的每个 属性 都将是一个 new 变量,但该变量将仅由 填充复制对应原文的内容

Underscore's clone function (link) 的文档中实际上提到了这一点。内容如下:

Create a shallow-copied clone of the provided plain object. Any nested objects or arrays will be copied by reference, not duplicated.


所以,正如您所猜测的,Underscore 中似乎没有开箱即用的 深度复制功能 .使用您在评论中提到的 cloneDeep 确实可以解决您的问题:)