如何在 Lodash 中将对象数组转换为对象?

18

我有这个:

    [ { list: 
             [ [Object],
               [Object] ] },
      { head:
             [ [Object],
               [Object] ] }
    ]

并且想把它转换成这样:

    { list: 
                 [ [Object],
                   [Object] ],
      head:      [ [Object],
                   [Object] ]
    }

使用lodash将对象数组转换为单个对象。


我对Java或lodash一无所知,但如果你已经做了任何研究,分享出来真的会很有帮助!;) - Augusta
5个回答

27

我认为一个更简短的解决方案是:

Object.assign({}, ...array)

我知道你要求使用lodash,但是似乎你并不需要这种方式。除非你想使用_.extend


也许我的js有问题 - 但这只会将最后一个元素作为对象返回。然而,以下代码产生了有趣的结果: Object.assign({}, ... rows.map(x=>{return {[x.name]:false}}) ); 与下面的代码相同。 - terary
嘿@terary,你能分享一下你的对象长什么样吗? - iamricard
{"list":[{"some":"object1"},{"some":"object2"}],"head":[{"some":"object3"},{"some":"object4"}]} Node v12.19 - terary
抱歉,我猜我应该问一下你的原始数组是什么样子的?或者你试图转换的是 list 属性吗? - iamricard

22
_.reduce(array, function(memo, current) { return _.assign(memo, current) },  {})

11

这是一个更简短的版本:

_.transform(array, _.ary(_.extend, 2),  {});

transform() 函数类似于 reduce(),但它不需要您返回任何内容。由于 extend() 修改了它的第一个参数,因此我们可以直接将其传递给 transform()。使用 ary() 进行包装,以确保只传递2个参数。


10

在 @rcsole 给出的精彩答案基础上,这个方法很有效:

states = [{
  state: "NY",
  name: "New York",
}, {
  state: "AZ",
  name: "Arizona",
}]

statesObj = Object.assign({}, ...states.map(state => { 
  return { [state.state]: state.name } 
}))

结果:

{
  AZ: "Arizona",
  NY: "New York",
}

这里发生了什么?

让我们将其分解成多个部分:

// Step 1: Transform from [{state: "Foo", name: "Bar"}, ...] to [{Foo: "Bar"}, ...]
mappedStates = states.map(state => { return { [state.state]: state.name } })

// Step 2: Merge all the objects in that array into a single new object
statesObj = Object.assign({}, ...mappedStates)

第一步使用 map 迭代数组中的每个项(每个状态对象)。map 对每个 state 对象执行一个函数,并返回一个新对象,其中状态为键,名称为值。我们需要在对象文本中将 state.state 用括号括起来,因为它是一个动态值。

第二步使用 Object.assignmappedStates 数组中的所有新状态对象合并到一个新对象中(第一个参数为 {})。 三个点 ... 是什么意思?那是扩展运算符,它将 mappedStates 数组中的每个元素转换为 Object.assign 方法的直接参数。

这个例子很清楚:

Object.assign({}, ...mappedStates)

等同于

Object.assign({}, {AZ: "Arizona"}, {NY: "New York"})

就是这样了!


1
感谢您展示了使用方括号按名称创建对象属性的用法。 - andig

1

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