выравнивание вложенного объекта в javascript - PullRequest
0 голосов
/ 27 февраля 2019

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

const source = {
  a: 1,
  b: {
    c: true,
    d: {
      e: 'foo'
    }
  },
  f: false,
  g: ['red', 'green', 'blue'],
  h: [{
    i: 2,
    j: 3
  }]
};

решение должно быть

const solution = {
    'a': 1,
    'b.c': true,
    'b.d.e': 'foo',
    'f': false,
    'g.0': 'red',
    'g.1': 'green',
    'g.2': 'blue',
    'h.0.i': 2,
    'h.0.j': 3
};

попытка для одного глубоко вложенного объекта

let returnObj = {}

let nestetdObject = (source, parentKey) => {

    let keys = keyFunction(source);

    keys.forEach((key) => {
      let values = source[key];

      if( typeof values === 'object' && values !== null ) {
        parentKey = keys[0]+'.'+keyFunction(values)[0]
        nestetdObject(values, parentKey);
      }else{
        let key = parentKey.length > 0 ? parentKey : keys[0];
        returnObj[key] = values;
      }
    })
    return returnObj
};

// Key Extractor 
let keyFunction = (obj) =>{
  return Object.keys(obj);
}

, вызывающего функцию

nestetdObject(source, '')

Но моя попытка не удастся, если объект похож на { foo: { boo : { doo : 1 } } }.

1 Ответ

0 голосов
/ 27 февраля 2019

Вы должны быть в состоянии сделать это довольно просто с помощью рекурсии.То, как это работает, заключается в том, что вы просто рекурсивно вызываете синтаксический анализатор для дочерних объектов, которые добавляют правильный ключ по пути вниз.Например (хотя и не очень проверено):

const source = {
  a: 1,
  b: {
    c: true,
    d: {
      e: 'foo'
    }
  },
  f: false,
  g: ['red', 'green', 'blue'],
  h: [{
    i: 2,
    j: 3
  }]
}

const flatten = (obj, prefix = '', res = {}) => 
  Object.entries(obj).reduce((r, [key, val]) => {
    const k = `${prefix}${key}`
    if(typeof val === 'object'){ 
      flatten(val, `${k}.`, r)
    } else {
      res[k] = val
    }
    return r
  }, res)
 
console.log(flatten(source))
...