将2d数组转换为对象的好方法

时间:2017-11-14 22:58:51

标签: javascript ecmascript-2017

使用 ES7 ES8,我可以将对象转换为数组数组,如下所示:

let obj = { a: '1', b: '2', c: '3' }
let arr = Object.entries(obj)
// [ [ 'a', '1' ], [ 'b', '2' ], [ 'c', '3' ] ]

但如果我想反过来呢?我可以使用for循环,或者像下面的数组的reduce方法,但是有更直接的方法吗?

let arr =[ [ 'a', '1' ], [ 'b', '2' ], [ 'c', '3' ] ]
let obj = arr.reduce((o, x)=>{o[x[0]]=x[1];return o}, {})
// { a: '1', b: '2', c: '3' }

一个用例:我想将"a=1;b=2;c=3"这样的字符串转换为像{ a: '1', b: '2', c: '3' }这样的对象,最后得到类似

的内容
"a=1;b=2;c=3"
  .split(";")
  .reduce((o, x)=>{
    let parts=x.split("=")
    o[parts[0]]=parts[1]
    return o
  }, {});


编辑: 正如评论中所指出的,reduce语法可以简化(或至少缩短)到:

arr.reduce((o, [k, v])=>(o[k]=v, o), {})

...或者用Object.assign这样写:

arr.reduce((o, [k, v])=>Object.assign(o, {[k]: v}), {})

无论哪种方式,根据评论,问题的答案是。这是我们获得的最佳方法。

1 个答案:

答案 0 :(得分:2)

您想要一些单行 unentries功能吗?

const detries = entries => entries.reduce((result, [key, value]) => Object.assign(result, {[key]: value}), {});

const entries = Object.entries({a: 1, b: 2, c: 3});
const detried = detries(entries);

console.info("ENTRIES", entries);
console.info("DETRIED", detried);

编辑:Object.fromEntries proposal

你可能会使用这个。

  

Object.fromEntries被建议执行Object.entries的反转:它接受一个可迭代的键值对并返回一个新对象,其自己的键和相应的值由这些对给出。

Object.fromEntries([["apple", 0], ["banana", 1]]) // {apple: 0, banana: 1}