【问题标题】:Object.assign recursive does not work as expectedObject.assign 递归不能按预期工作
【发布时间】:2018-08-19 04:09:24
【问题描述】:

我有以下功能:

const test = (i, o) => {
  if (i < 1)
    return o
  else
    return Object.assign(o, test(i - 1, ({
      value: i,
      label: i
    })))
}

console.log(test(5, ({})))

而我除了打印:

[
    { value: '1', label: '1' },
    { value: '2', label: '2' },
    { value: '3', label: '3' },
    { value: '4', label: '4' },
    { value: '5', label: '5' }
]

但是结果是:

{ value: 1, label: 1 }

递归 Object.assign 有什么问题?

【问题讨论】:

  • 你的函数有什么目的?
  • valuelabel 不断被递归调用覆盖,因此您只能获得最深的值。如果那是您想要的,那么您不会创建一个数组。
  • 把console.log放到else中
  • @connexo 我想构造一个具有向上计数值的大对象,我想稍后在 html 表中使用它。我知道我可以使用 for 循环来做到这一点,但是我认为递归应该是可能的,或者至少我不知道为什么它不应该使用递归。
  • 仅供参考,您当然也可以使用递归来实现。你只是不需要Object.assign 来做到这一点。 const test = (i, a) =&gt; { if (i &lt; 1) return a else return a.concat(test(i - 1, a), {value:i, label:i}) } console.log(test(5, []))

标签: javascript recursion functional-programming


【解决方案1】:

这可能有意义的唯一方法是将数组作为结果。

这是一个可能的解决方案:

function test(length) {
  return [...Array(length).keys()]
    .map(i => ({value: i + 1, label: i + 1}))
}

console.log(test(5));

【讨论】:

  • 这就是我要找的东西,我想我的问题不是很准确,抱歉
  • @madknight 没问题,发生了。
【解决方案2】:

如果你想在这里递归:

 const test = (i, o) => (i ? test(i - 1, o) : []).concat(Object.assign({}, o, { value: i, label: i }));

【讨论】:

  • 因为我使用 lodash/fp,所以我想出的最短解决方案是 const test = l => range(0, l).map(i => ({value: i + 1, label: i + 1})) (基于上一个答案)
  • 试着让它尾递归,这样你就可以把它和蹦床结合起来。
猜你喜欢
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-10
  • 2016-04-08
  • 2014-08-20
  • 1970-01-01
相关资源
最近更新 更多