Преобразуйте или нормализуйте вложенный JSON с помощью lodash - PullRequest
0 голосов
/ 02 сентября 2018

Я пытаюсь преобразовать вложенную структуру, используя библиотеку lodash, я достиг ожидаемого результата, но они не работают, если структура меняется, поэтому я прихожу к вам, чтобы помочь мне сделать более надежной функцию, которая преобразует JSON.

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

const data = {
  foo: {
    bar: {
      baz: [{ a: 1, b: 2, c: 3 }]
    },
    baz: {
      bar: [{ a: 1, b: 2, c: 3 }]
    },
    foo: {
      bar: [{ a: 1, b: 2, c: 3 }]
    }
  },
  bar: {
    baz: {
      bar: [{ a: 1, b: 2, c: 3 }]
    }
  },
  baz: {
    foo: {
      bar: [{ a: 1, b: 2, c: 3 }]
    }
  }
};

после преобразования

const transform = [
  {
    name: 'barfoo',
    results: [{ a: 1, b: 2, c: 3 }]
  },
  {
    name: 'bazfoo',
    results: [{ a: 1, b: 2, c: 3 }]
  },
  {
    name: 'foofoo',
    results: [{ a: 1, b: 2, c: 3 }]
  },
  {
    name: 'bazbar',
    results: [{ a: 1, b: 2, c: 3 }]
  },
  {
    name: 'foobaz',
    results: [{ a: 1, b: 2, c: 3 }]
  }
];

Идея преобразования состоит в том, чтобы соединить вложенный ключ первого уровня с ключом родительского узла, чтобы сгенерировать значение name в новом объекте и значение объекта на уровне 2 в качестве значения. из results

например, для первой итерации объекта foo в данных

name = key(foo.bar) + key(foo)
results = value(foo.bar.baz)

name = 'barfoo'
results = [{ a: 1, b: 2, c: 3 }]

name = key(foo.baz) + key(foo)
results = value(foo.baz.bar)

name = 'bazfoo'
results = [{ a: 1, b: 2, c: 3 }]

name = key(foo.foo) + key(foo)
results = value(foo.foo.bar)

name = 'foofoo'
results = [{ a: 1, b: 2, c: 3 }]

и другие объекты, находящиеся внутри данных.

1 Ответ

0 голосов
/ 02 сентября 2018

Я не уверен, будет ли когда-либо изменяться структура, но я добавил несколько дополнительных тестовых случаев, чтобы вы могли видеть, как это будет вести себя в некоторых дополнительных сценариях.

const data = {
  foo: {
    bar: {
      baz: [{ a: 1, b: 2, c: 3 }]
    },
    baz: {
      bar: [{ a: 1, b: 2, c: 3 }]
    },
    foo: {
      bar: [{ a: 1, b: 2, c: 3 }]
    }
  },
  bar: {
    baz: {
      bar: [{ a: 1, b: 2, c: 3 }]
    }
  },
  baz: {
    foo: {
      bar: [{ a: 1, b: 2, c: 3 }]
    }
  },
  a1: {
    a2: [{ a: 1, b: 2, c: 3 }]
  },
  b1: [{ a: 1, b: 2, c: 3 }],
  c1: {
    c2: {
      c3: {
        c4: [{ a: 1, b: 2, c: 3 }]
      }
    },
    c5: [{ a: 1, b: 2, c: 3 }]
  },
  d1: {
    d2: {
        d3: undefined
    }
  },
  e1: {
    e2: {
        e3: null
    }
  },
  f1: {
    f2: {
        // Ignored
    }
  }
};

function transformObject(object, name) {
    if (!name) {
        name = "";
    }
    return _.flatten(_.map(object, function(value, key) {
        if (typeof value === "undefined" 
            || value === null 
            || _.isArray(value)) {
            return {
                name: name,
                results: value
            }
        }
        var objectName = key + name;
        return transformObject(value, objectName);
    }));
}

transformObject(data);
...