【发布时间】:2023-04-06 10:18:01
【问题描述】:
使用 ES7 ES8 我可以将一个对象转换为这样的数组数组:
let obj = { a: '1', b: '2', c: '3' }
let arr = Object.entries(obj)
// [ [ 'a', '1' ], [ 'b', '2' ], [ 'c', '3' ] ]
但是如果我想反过来呢?我可以使用 for 循环,或者像下面这样的 Array 的 reduce-method,但是有更直接的方法吗?
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
}, {});
编辑: 正如 cmets 所指出的,reduce 语法可以简化(或至少缩短)为:
arr.reduce((o, [k, v])=>(o[k]=v, o), {})
...或者用Object.assign这样写:
arr.reduce((o, [k, v])=>Object.assign(o, {[k]: v}), {})
不管怎样,根据 cmets 的说法,这个问题的答案是 否。这是我们最好的方法。
【问题讨论】:
-
您可以缩短/简化对
(o, [k, v]) => Object.assign(o, {[k]: v})的回调,但除此之外没有什么更好的了 -
这是 ES2017,而不是 ES7。就像 Bergi 解释的那样,或者
.reduce((o, [k, v]) => (o[k] = v, o), {})(速度更快,但有逗号)。 -
@estus 谢谢,我会更新问题。
-
通常这就是实用程序库的用途(例如 lodash 的 _.fromPairs)
-
我已将标签更新为正确。 Object.entries 属于 ES2017。 ES7 和 ES8 是不推荐使用的通俗术语,这样的规范不存在。
标签: javascript ecmascript-2017