【问题标题】:How to transform an array to an object [duplicate]如何将数组转换为对象[重复]
【发布时间】:2018-03-28 10:55:23
【问题描述】:

我想转这个:

let myArray = [ {city: "NY"}, {status: 'full'} ];

到这里:

let myObj = { city: "NY", status: 'full' };

当我尝试这个时:

let newObj = {};
for (var i = 0; i < myArray.length; i++) {
  (function(x) {
    newObj = Object.assign(myArray[i]);
  })(i);
}

它将最后一对分配给对象

【问题讨论】:

  • 您请求的对象无效;你不能有{ { city: 'NY' } }

标签: javascript arrays object


【解决方案1】:

您也可以使用Array.reduce(),这将为您提供更精细的粒度控制:

const myArray = [
  { city: 'NY', color: 'blue', rodents: { small: false, medium: false, large: true } },
  { status: 'full', color: 'red' },
  { sandwich: 'flavourful' },
]
    
// item is each object in your array
const reduced = myArray.reduce((newObj, item) => {
  // existing props will be overwritten by newer object entries in the array
  // this example is same as Object.assign spread with right to left precedence,
  // until you want more custom logic
  Object.keys(item).forEach((key) => { newObj[key] = item[key] })
  return newObj
}, {})
    
console.log(reduced)
// you will see `red` overwrite `blue`

编辑:一年后检查此答案后,我注意到它根本没有针对深度克隆或深度合并的能力进行优化。我建议您更仔细地研究这些方面,如果您的工作不可变,请小心复制或破坏引用。

在上面的示例中这没有问题,因为所有值都是基元。

【讨论】:

    【解决方案2】:
    let myArray = [ {city: "NY"}, {status: 'full'} ];
    
    let newObj = myArray.reduce((acc, curr) => {
        Object.keys(curr).forEach(val => {
        acc[val] = curr[val]
      })
      return acc
    }, {})
    
    console.log(newObj)
    

    根据 caniuse.com,IE 支持此语法

    【讨论】:

    • 没有任何上下文的代码块不是最佳答案。请考虑对此进行扩展。即使从问题的上下文来看,“支持 IE”的含义也不清楚。
    • map 不使用结果是仅迭代数组的错误模式。你可以使用forEach
    【解决方案3】:

    Spread 数组转换成Object#assign:

    const myArray = [ {city: "NY"}, {status: 'full'} ];
    
    const myObj = Object.assign({}, ...myArray);
    
    console.log(myObj);

    注意:赋值给一个空对象。如果省略空对象,则原始数组的第一个元素将被变异(所有内容都将合并到其中)。

    【讨论】:

    • 是的,这就是我的意思。这是一个错误
    • 值得注意的是,扩展运算符在 IE 11 中不可用
    • 解决扩展语法并使用 Object.assign 是没有意义的,这在 IE11 中不可用。
    • @NinaScholz - 没错。我高估了 IE11 :)
    【解决方案4】:

    我倾向于同意Ori 的观点,即您的问题似乎是关于创建索引对象,这通常不是一个好的计划,但如果需要用数字键入对象,您可以这样做:

    let newObj = {};
    myArray.forEach((val, index) => { newObj[index] = val });
    

    【讨论】:

    • 是的,这就是我的意思。这是一个错误
    猜你喜欢
    • 2021-09-29
    • 2018-09-12
    • 2023-03-19
    • 1970-01-01
    • 2017-09-23
    • 2017-08-11
    • 1970-01-01
    相关资源
    最近更新 更多