Объединить ключи в объекте JSON для возврата массива объединенных ключей и значения с Javascript - PullRequest
0 голосов
/ 23 марта 2020

Я хочу преобразовать ввод в вывод с помощью Javascript. Любая помощь? На входе также может быть больше вложенных объектов.

const input = {
   a: {
     b: 22,
     c: 'hello',
   },
   e: 456
}

const output = [
    { 'a.b': 22},
    { 'a.c': 'hello' },
    { 'e': 456 }
];

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Для этого вы можете создать рекурсивную функцию, используя метод reduce.

const input = {
  a: {
    b: true,
    c: 'hi',
  },
  d: 123
}

function convert(data, prev = '') {
  return Object.entries(data).reduce((r, [k, v]) => {
    let key = prev + (prev ? '.' : '') + k;

    if (typeof v == 'object') {
      r.push(...convert(v, key))
    } else {
      r.push({ [key]: v })
    }

    return r;
  }, [])
}

const result = convert(input)
console.log(result)
0 голосов
/ 24 марта 2020

// Лучший и быстрый способ решения '

Object.entries(data).reduce((r, [k, v]) => { медленнее с большим json.

Бенчмарк

enter image description here

НЕТ БОЛЬШЕ L OOP ЗА Object.entries()

const input = { a: { b: 22, c: "hello", d: { f: 10 } }, e: 456 };
function flat(data, key = "", result = []) {
  for (let k in data) {
    if (typeof data[k] === "object") {
      flat(data[k], key + k + ".", result);
    } else result.push({ [key + k]: data[k] });
  }
  return result;
}
console.log(flat(input));

const input = { a: { b: 22, c: "hello", d: { f: 10 } }, e: 456 };
function flat(data, key = "", result = []) {
  for (let k in data) {
    if (typeof data[k] === "object") {
      flat(data[k], key + k + ".", result);
    } else result.push({ [key + k]: data[k] });
  }
  return result;
}
console.log(flat(input));
...