0

我想将跟随数组转换为稍微修改的对象(见下文)。我也在尝试练习使用扩展运算符,但一直无法弄清楚如何做到这一点。我试图避免使用 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;
}, {});

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

其他有帮助内容的帖子:

4

2 回答 2

2

简短的回答

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

解释

我们正在调用Array.prototype.reduce(), 并且对于数组中的每个对象,mainkey从其余属性中解构(Johnmainkey可以这样,也可以是这样的:.rest{val1: 'ABC', val2: '..', val3: '..' }

然后,我们想要返回具有深度变化的累加器,因此我们使用扩展运算符,然后将插值mainkey属性 ( [mainkey]) 设置为rest

于 2017-09-19T01:34:38.453 回答
1

只需更改为..

    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;
}, {});   
于 2017-09-19T01:35:49.920 回答