【问题标题】:Good ways to convert 2d array to object将二维数组转换为对象的好方法
【发布时间】: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


【解决方案1】:

你想要一些单行 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}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-10
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 2013-06-23
    相关资源
    最近更新 更多