Хитрый объект сплющивания - PullRequest
0 голосов
/ 23 марта 2020

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

{
   a: {
      site1: {
         type1: {
            item1: 42,
            item2: 13
         }
      },
      site2: {
         type2: {
            item3: 35
         }
      }
   }
}

И вам нужно поместить его в массив:

[
   [ a, site1, type1, 42],
   [ a, site1, type1, 13],
   [ a, site2, type2, 35]
]

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

Вот немного более простое решение:

function flattenObject(objToFlat, path = []) {
  return Object.keys(objToFlat).reduce(
    (result, key) => [
      ...result,
      ...(typeof objToFlat[key] === 'object'
        ? flattenObject(objToFlat[key], [...path, key])
        : [[...path, objToFlat[key]]]),
    ],
    []
  );
}

Обратите внимание, что вам не нужно передавать пустой массив в функцию.

Вы можете протестировать решение в этом плунжере: http://plnkr.co/edit/IM5v3fyAMrfV5HKS?open=lib%2Fscript.js

0 голосов
/ 23 марта 2020

Вам нужно пройти через дерево:

const data = {
  a: {
    site1: {
      type1: {
        item1: 42,
        item2: 13,
      },
    },
    site2: {
      type2: {
        item3: 35,
      },
    },
  },
};

function walk(data, out, path = []) {
  Object.keys(data).forEach(key => {
    const newPath = [...path, key];
    const value = data[key];
    if (typeof value === "object") {
      walk(value, out, newPath);
    } else {
      out.push([newPath, value]);
      // Or if you really don't need the value...
      //out.push(newPath);
    }
  });
}

const out = [];
walk(data, out);
console.log(out);

выводит

[
  [ [ 'a', 'site1', 'type1', 'item1' ], 42 ],
  [ [ 'a', 'site1', 'type1', 'item2' ], 13 ],
  [ [ 'a', 'site2', 'type2', 'item3' ], 35 ]
]

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

...