【问题标题】:How to convert an array of objects to an object in Lodash?如何将对象数组转换为 Lodash 中的对象?
【发布时间】:2015-07-25 02:56:06
【问题描述】:

我有这个:

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

想把它变成这样:

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

于是一个对象数组变成了一个对象。用 lodash 实现这一点会很棒。

【问题讨论】:

  • 我对 Java 或 lodash 一无所知,但如果你做过任何研究,如果你也分享一下,它真的会有所帮助! ;)

标签: javascript arrays object lodash


【解决方案1】:
_.reduce(array, function(memo, current) { return _.assign(memo, current) },  {})

【讨论】:

    【解决方案2】:

    这是一个较短的版本:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 也许我的 js 坏了——但这只是让我把最后一个元素作为一个对象。然而,这有一个有趣的结果:Object.assign({}, ... rows.map(x=>{return {[x.name]:false}}) ); 下面是一样的
      • 嘿@terary,你能分享一下你的对象是什么样子的吗?
      • {"list":[{"some":"object1"},{"some":"object2"}],"head":[{"some":"object3"}, {"some":"object4"}]} 节点 v12.19
      • 对不起,我想我应该问一下你的原始数组是什么样的?还是您要转换的 list 属性?
      【解决方案4】:

      在 lodash 4 上使用 fromPairs。https://lodash.com/docs#fromPairs

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

      【讨论】:

        【解决方案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.assign 将mappedStates 数组中的所有新状态对象合并为一个新对象(第一个参数{})。 ... 的三个点是什么?这就是传播运算符。它获取mappedStates 数组中的每个元素并将它们转换为Object.assign 方法的直接参数。

        这个例子很清楚:

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

        与

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

        就是这样!

        【讨论】:

        • 感谢您展示使用方括号按名称创建对象属性
        猜你喜欢
        • 1970-01-01
        • 2016-08-06
        • 1970-01-01
        • 2019-04-18
        • 2017-12-21
        • 1970-01-01
        • 2015-10-12
        • 2018-05-22
        • 1970-01-01
        相关资源
        最近更新 更多