Преобразование в правильный формат объекта из массива - PullRequest
2 голосов
/ 10 июля 2019

Мне известны такие опции, как оператор распространения и Object.assign (), когда дело доходит до преобразования массива в объект, однако мне трудно понять, как отформатировать конечный объект в нужном мне формате.

Мой исходный массив выглядит следующим образом:

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

Объект, который я хочу получить из этих данных, должен выглядеть следующим образом:

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

Что я пробовал такfar, используя object.assign (), заканчивает тем, что добавляет числа в качестве ключей свойств в результирующий объект, что явно не то, что я ищу:

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

Как я могу получить результирующий объект отформатированныйкак мне здесь нужно?

Ответы [ 2 ]

6 голосов
/ 10 июля 2019

Вам нужно глубже взглянуть на объект, взять разделенный ключ и уменьшить их, взяв объект со свойством или пустой объект.В конце присвойте значение.

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 голос
/ 10 июля 2019

Попробуйте это:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...