【问题标题】:How can I clone an object and iterate over one of it's properties?如何克隆一个对象并迭代它的一个属性?
【发布时间】:2015-09-16 09:25:43
【问题描述】:

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

这些似乎不起作用,options 对象似乎在每次迭代中迭代最后生成的对象{ body: { action: 'read', page_num: 44, page_size: 5 } }

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

【问题讨论】:

  • 我相信我通过切换到 lodash 的 cloneDeep 解决了这个问题。
  • 这与 promises/bluebird 到底有什么关系?你对console.log(allOptions) 没有同样的行为吗?

标签: javascript object promise clone bluebird


【解决方案1】:

是的,你是对的,下划线clone函数并不

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

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

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


所以,正如您所猜想的那样,Underscore 中似乎没有开箱即用的深拷贝功能。正如您在评论中提到的那样使用cloneDeep 确实可以解决您的问题:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多