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

时间:2015-05-13 17:12:58

标签: javascript arrays object lodash

我有这个:

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

想把它变成这个:

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

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

5 个答案:

答案 0 :(得分:19)

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

答案 1 :(得分:12)

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

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

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

答案 2 :(得分:8)

这是一个较短的版本:

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

transform()函数类似于reduce(),除非它不期望您返回任何内容。由于extend()正在改变它的第一个参数,我们可以直接将其传递给transform()。它包含在ary()中,以确保它只传递2个参数。

答案 3 :(得分:5)

要建立@ 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)

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

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

这个例子说得很清楚:

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

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

就是这样!

答案 4 :(得分:1)

Use fromPairs on lodash 4. https://lodash.com/docs#fromPairs

_.fromPairs([['fred', 30], ['barney', 40]]);