一种更简洁的方式来转换JS对象?

时间:2018-02-24 06:09:40

标签: javascript functional-programming

请参阅下面的代码。有没有更简洁的方法将originalObject转换为myObject? 关键是我尝试根据myObject中每个媒体资源中的id设置originalObject的媒体资源名称。

myObject = Object
    .values( originalObject )
    .reduce( (acc, x) => {
        let propHolder = {}
        propHolder[x.id] = false
        return Object.assign( acc, propHolder )
    }, {} )

3 个答案:

答案 0 :(得分:2)

由于您有let,因此您已计算出属性:

myObject = Object.values(originalObject).reduce((acc, x)=>{
             return Object.assign(acc, {[x.id]: false})
           },{})

现在因为箭头功能只是一个回报:

myObject =
  Object.values(originalObject)
    .reduce((acc, x) => Object.assign(acc, {[x.id]: false}), {})

如果你不介意制作一个数组:

myObject =
  Object.values(originalObject)
    .map(x => ({[x.id]: false}))
    .reduce(Object.assign, {});

我希望手头有一个fromPairs功能。

myObject = fromPairs(
  Object.values(originalObject)
    .map(x => [x.id, false])
);

如果你使用Lodash的fromPairs,你也可以使用它的map

myObject = _.fromPairs(
  _.map(originalObject, x => [x.id, false])
);

答案 1 :(得分:2)

看到Ryan对优雅而长的单线的答案。但既然你要求一种简洁的方法,这就是简单的解决方案:

myObject = {};
for (const k in originalObject)
   myObject[originalObject[k].id] = false;

或者可能更有趣:

myObject = {};
for (const {id} of Object.values(originalObject))
   myObject[id] = false;

答案 2 :(得分:1)

您可以使用Javascript的spread语法:

const myObject = Object
  .values(originalObject)
  .reduce((acc, x) => ({ ...acc, [x.id]: false }), {})

更多阅读:Spread syntax