【问题标题】:Mapping array to object using spread使用传播将数组映射到对象
【发布时间】:2018-02-27 15:24:41
【问题描述】:

我想将跟随数组转换为稍微修改的对象(见下文)。我也在尝试练习使用扩展运算符,但一直无法弄清楚如何做到这一点。我试图避免使用 lodash(用于教育目的)。

起始数组:

var arr = [
    { mainkey: 'John', val1: 'ABC', val2: '..', val3: '..' },
    { mainkey: 'Mary', val1: 'DEF', val2: '..', val3: '..' },
    { mainkey: 'Ann', val1: 'XYZ', val2: '..', val3: '..' }
  ];

到最终对象:

newObj = {
  John: {val1: 'ABC', val2: '..', val3: '..' },
  Mary: {val1: 'DEF', val2: '..', val3: '..' },
  Ann:  {val1: 'XYZ', val2: '..', val3: '..' }
}

不使用扩展运算符,这很接近,但不是我需要的:

var result = arr.reduce(function(map, obj) {
    map[obj.mainkey] = obj.val1;
    // map[obj.mainkey] = { obj.val1, obj.val2 }; <-- DOESNT WORK
    return map;
}, {});

使用扩展运算符,我所做的任何事情都会失败。

其他内容有用的帖子:

【问题讨论】:

    标签: javascript arrays reactjs spread-syntax


    【解决方案1】:

    简答

    const newObj = arr.reduce(
        (acc, { mainkey, ...rest }) => ({ ...acc, [mainkey]: rest }),
        {}
      )
    

    解释

    我们调用Array.prototype.reduce(),对于数组中的每个对象,从其余属性中解构mainkey(因此mainkey 可能是Johnrest 可能是像这样的东西:{val1: 'ABC', val2: '..', val3: '..' }

    然后,我们想要返回一个深度变化的累加器,所以我们使用扩展运算符,然后将插入的mainkey 属性([mainkey])设置为rest

    【讨论】:

    • 感谢@guy 的解释,这很有帮助(特别是因为我出于教育目的而尝试这样做,即使我的应用程序也需要它)
    【解决方案2】:

    只需更改为..

        var result = arr.reduce(function(map, obj) {
            map[obj.mainkey] = {
                val1: obj.val1,
                val2: obj.val2,
            };
            return map;
        }, {});        
    

    更新: 添加其他动态版本。

    var result = arr.reduce(function(map, obj) {
        let targetProps = Object.getOwnPropertyNames(obj).filter(
            (prop) => prop !== "mainkey"
        );
        map[obj.mainkey] = {};
        targetProps.forEach( (prop) => {
            map[obj.mainkey][prop] = obj[prop];
        });
        return map;
    }, {});   
    

    【讨论】:

    • 感谢@panghea 展示了如何改编我的原作!
    • 如果您有兴趣帮助我完成此版本:您将如何处理拥有 10 多个值而不必将它们全部拼出(或动态数量?)
    • 添加动态版本:)
    • 你太棒了!
    猜你喜欢
    • 2018-11-08
    • 2022-11-24
    • 1970-01-01
    • 2021-04-18
    • 2020-11-09
    • 2016-05-31
    • 2018-09-22
    • 2021-07-29
    • 2019-10-13
    相关资源
    最近更新 更多