Помощь в выравнивании массива объектов, у которых есть объект (или потенциал больше 1) в пределах - PullRequest
1 голос
/ 25 апреля 2019

Я пытаюсь сгладить массив объектов, у которого есть объект внутри этого объекта (но также может быть больше).Полученный формат должен представлять собой просто массив объектов.

Вот как это выглядит в настоящее время:

var array = [
  {
    nickname: "Johnny",
    first_name: "John",
    last_name: "Smith",
    info: {
      married: "yes",
      kids_ages: []
    }
  },
  {
    {
    nickname: "Ron",
    first_name: "Ronald",
    last_name: "Smith",
    info: {
      married: "no",
      kids_ages: []
    }
  },
  {
    nickname: "Johnny",
    first_name: "John",
    last_name: "Smith",
    info: {
      married: "yes",
      kids_ages: [17]
    },
    kids: {
      first_name: "Harry",
      last_name: "Smith
  }
 }
]

Должно быть так для первой записи:

{
  nickname: "Johnny",
  first_name: "John",
  last_name: "Smith",
  married: "yes"
  kids_ages: []
},

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

Вы можете получить info из объекта и назначить этот объект вместе с остальным одним объектом.

var array = [{ nickname: "Johnny", first_name: "John", last_name: "Smith", info: { married: "yes", kids_ages: [] } }, { nickname: "Ron", first_name: "Ronald", last_name: "Smith", info: { married: "no", kids_ages: [] } }, { nickname: "Johnny", first_name: "John", last_name: "Smith", info: { married: "yes", kids_ages: [17] }, kids: { first_name: "Harry", last_name: "Smith" } }],
    flat = array.map(({ info, ...object }) => ({ ...object, ...info }));

console.log(flat);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Другой подход, сохраняя ключ внешнего объекта в качестве префикса.

function getFlat(object, parent) {
    return Object.assign({}, ...Object.entries(object).map(([k, v]) => {
        if (v && typeof v === 'object' && !Array.isArray(v)) {
            return getFlat(v, k);
        }
        return { [parent  + (parent && '_') + k]: v };
    }));
}

var array = [{ nickname: "Johnny", first_name: "John", last_name: "Smith", info: { married: "yes", kids_ages: [] } }, { nickname: "Ron", first_name: "Ronald", last_name: "Smith", info: { married: "no", kids_ages: [] } }, { nickname: "Johnny", first_name: "John", last_name: "Smith", info: { married: "yes", kids_ages: [17] }, kids: { first_name: "Harry", last_name: "Smith" } }],
    flat = array.map(o => getFlat(o));

console.log(flat);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 25 апреля 2019

Из моего комментария: Попробуйте array.prototype.map, а затем на каждом объекте array.prototype.reduce. Подумай о конфликтах. Что делать с последним объектом, когда у вас есть first_name в объекте kids и в родительском объекте. Вы хотите сохранить оба, последний, первый, какой-нибудь случайный?

Например:

const flat = arr => arr.map(element => 
  Object.entries(element).reduce((sum, [key, value]) => { 
    if (isObject(value)) {
      return {...sum, ...value}
      // or anything else to manage conflicts, depends on the way you want to handle it
    } 
  return {...sum, [key]: value }
}, {}))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...