从数组转换为正确的对象格式

时间:2019-07-10 19:56:18

标签: javascript arrays object

在将数组转换为对象时,我知道诸如spread运算符和Object.assign()之类的选项,但是,我很难弄清楚如何将最终对象格式化为所需的格式。

我的原始数组如下:

let propsArray = [ { id: '1' },
  { 'name.first': 'john' },
  { 'name.last': 'smith' } ]

我要从此数据中获取的对象应如下所示:

{
  "id" : 1,
  "name" : {
      "first" : "john",
      "last" : "smith"
  }
}

到目前为止,我尝试使用object.assign()进行的操作最终在结果对象中添加了数字作为属性键,这显然不是我想要的:

  let finalObj = Object.assign({}, propsArray);

如何将生成的对象格式化为所需的格式?

2 个答案:

答案 0 :(得分:6)

您需要更深入地了解对象,并通过使用具有属性的对象或空对象来获取分割后的键并减少分割键。最后,指定值。

var data = [{ id: '1' }, { 'name.first': 'john' }, { 'name.last': 'smith' }],
    result = data.reduce((r, o) => {
        Object.entries(o).forEach(([k, v]) => {
            var keys = k.split('.'),
                last = keys.pop();
            keys.reduce((q, k) => q[k] = q[k] || {}, r)[last] = v;        
        });
        return r;
    }, {});

console.log(result);

答案 1 :(得分:1)

尝试一下:

const data = [
  {
    "id": "1"
  },
  {
    "name.first": "john"
  },
  {
    "name.last": "smith"
  }
]

const result = Object.entries(Object.assign({}, ...data))
.reduce((acc,[k,v])=>{
    [first, last] = k.split('.');
    if (!last) {
        acc[k] = v
    } else {
        acc[first] = acc[first] || {};
        acc[first][last] = v;
    }
    return acc
}, {})

console.log(result);