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

Ste*_*fan 12 javascript arrays object lodash

我有这个:

    [ { list: 
             [ [Object],
               [Object] ] },
      { head:
             [ [Object],
               [Object] ] }
    ]
Run Code Online (Sandbox Code Playgroud)

并希望将其变成这样:

    { list: 
                 [ [Object],
                   [Object] ],
      head:      [ [Object],
                   [Object] ]
    }
Run Code Online (Sandbox Code Playgroud)

所以一个对象数组到一个对象中.用lodash实现这一目标会很棒.

dja*_*ski 21

_.reduce(array, function(memo, current) { return _.assign(memo, current) },  {})
Run Code Online (Sandbox Code Playgroud)


小智 14

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

Object.assign({}, ...array)
Run Code Online (Sandbox Code Playgroud)

我知道你要求lodash,但看起来你甚至不需要这样.除非你想使用_.extend.


Ada*_*uch 8

这是一个较短的版本:

_.transform(array, _.ary(_.extend, 2),  {});
Run Code Online (Sandbox Code Playgroud)

变换()函数就像是减少() ,但它没有指望你任何回报.由于extend()正在改变它的第一个参数,我们可以直接将其传递给它transform().它包含在ary()中以确保它只传递2个参数.


Joh*_*rug 7

要建立@ rcsole的好答案,这很有效:

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

statesObj = Object.assign({}, ...states.map(state => { 
  return { [state.state]: state.name } 
}))
Run Code Online (Sandbox Code Playgroud)

结果:

{
  AZ: "Arizona",
  NY: "New York",
}
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

让我们分解成多个部分:

// 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)
Run Code Online (Sandbox Code Playgroud)

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

步骤2用于Object.assignmappedStates数组中的所有新状态对象合并为一个新对象(第一个参数{}).这三个点...是什么?那是传播运营商.它接受mappedStates数组中的每个元素并将它们转换为Object.assign方法的直接参数.

这个例子清楚地说明了:

Object.assign({}, ...mappedStates)
Run Code Online (Sandbox Code Playgroud)

是相同的

Object.assign({}, {AZ: "Arizona"}, {NY: "New York"})
Run Code Online (Sandbox Code Playgroud)

而已!