【问题标题】:Transform an array of objects in an object list with a property of the object as key以对象的属性为键转换对象列表中的对象数组
【发布时间】:2017-11-23 17:19:31
【问题描述】:

我有一个对象数组,我想将其转换为一个对象,其中对象键是对象的属性之一,例如:

原始数组示例:

const myArray = [
  {"groupName":"groupname","description":"nice description here","name":"name1","value":107},
  {"groupName":"groupname","description":"nice description here","name":"name1","value":107}
]

使用 es6 不错的新功能,Object.assign 非常接近我的需要,但它为对象分配了数字键,例如:

let newObject = Object.assign({}, myArray);

这给了我一个非常接近的对象,例如:

{
  "0": {"groupName":"groupname","description":"nice description here","name":"name1","value":107},
  "1": {"groupName":"groupname","description":"nice description here","name":"name1","value":107}
}

但我真正需要的是将对象的属性之一作为键而不是分配的数字,例如:

{
  "name1": {"groupName":"groupname","description":"nice description here","name":"name1","value":107},
  "name2": {"groupName":"groupname","description":"nice description here","name":"name2","value":107}
}

我可以迭代和创建对象,但是在使用 Object.assign 提供了一个非常接近的解决方案之后,我想知道 es6 中是否有一种方法可以在不使用 forEach 或 map 进行迭代的情况下做同样的事情。

想法?

【问题讨论】:

  • 你确定没有重名吗?如果是这样,那么一些对象将会丢失。
  • @ibrahimmahrir 我理解,但是是的,在真实情况下没有重复的名称。无论如何都要发送警告!

标签: javascript arrays object ecmascript-6


【解决方案1】:

要将数组转换为以特定值作为键的对象,您需要迭代数组,并构建对象的属性。


使用Array#reduce“手动”向对象添加属性:

const myArray = [{"groupName":"groupname","description":"nice description here","name":"name1","value":107}, {"groupName":"groupname","description":"nice description here","name":"name2","value":107}]

const result = myArray.reduce((r, o) => (r[o.name] = o, r), {});

console.log(result);

或者


使用Array#map 将每个对象包装在一个带有键的对象中,然后使用Object#assignspread 将它们组合成单个对象:

const myArray = [{"groupName":"groupname","description":"nice description here","name":"name1","value":107}, {"groupName":"groupname","description":"nice description here","name":"name2","value":107}]

const result = Object.assign({}, ...myArray.map((o) => ({ [o.name]: o })));

console.log(result);

【讨论】:

    【解决方案2】:

    好吧,当简单的操作可以工作时,为什么需要 es6 和 map/reduce/forEach 形式的循环。

    let myArray = [
      {"groupName":"groupname","description":"nice description here","name":"name1","value":107},
      {"groupName":"groupname","description":"nice description here","name":"name2","value":108}
    ]
    let newObject ={};
    newObject[myArray[0].name] = myArray[0];
    newObject[myArray[1].name] = myArray[1];
    console.log(newObject);
    

    【讨论】:

    • 如果数组中有无数个(10^100000)个条目怎么办?
    • 点了。当他/她指定不使用 forloop 时,我假设 OP 不想循环
    • @ibrahimmahrir 我们需要更多内存
    • @apokryfos 这是不可避免的。但使用此解决方案,您还需要更多的耐力和更多的硬盘存储空间,才能键入和存储这些代码行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 2019-02-10
    • 2022-12-08
    • 2022-11-01
    • 1970-01-01
    • 2021-02-15
    • 2017-07-07
    相关资源
    最近更新 更多