Javascript unlatten массив / изменение структуры данных - PullRequest
0 голосов
/ 09 мая 2018

Так вот в чем проблема и вот скрипка: https://jsfiddle.net/6zqco0mj/

const start = [{'a':'b'}, {'b':'c'}, {'c':'d'}, {'d':'e'}]
end = 
{a:
  {b:
    {c:
      {
       d: {}
      }
    }
  }
}

У меня есть некоторый код, но я не уверен, как бы я копнул глубже в объект

const start = [{'b':'c'}, {'a':'b'}, {'c':'d'}, {'d':'e'}];
const end = {};

function convert(key) {
  const obj = getObj(key);

  if(obj) {
    const temp = {};
    temp[obj[key]] = convert(obj[key]);
    //findKey(obj[key]);
    end[key] = temp;
  }
}

function getObj(key) {
  const foo = start.find((el, i) => { if(el[key]) { return el[key] } });
  return foo;
}

function findKey(k) {
// what goes here?  
}
convert('a');
console.log(end);

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Вы можете использовать структуру объекта для сбора данных и построения дерева.

Это решение работает с несортированными данными.

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

var data = [{ d: 'e' }, { b: 'c' }, { c: 'd' }, { a: 'b' }, { b : 'z' }],
    tree = function (data) {
        var keys = new Set,
            values = new Set,
            r = Object.create(null);

        data.forEach(function (o) {
            var [key, value] = Object.entries(o)[0];
            keys.add(key);
            values.add(value);
            r[value] = r[value] || {};
            r[key] = r[key] || {};
            r[key][value] = r[key][value] || r[value];
        });

        values.forEach(v => keys.delete(v));
        return Object.assign(...Array.from(keys, k => ({ [k]: r[k] })));
    }(data);

console.log(tree);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 09 мая 2018

я думаю, что вы пошли другим путем из-за своего подхода к рекурсивности; я попробовал, и это то, что я получил до сих пор

const start = [{'b':'c'}, {'a':'b'}, {'c':'d'}, {'d':'e'}];


function convert(key, object) {
   const obj = getObj(key);

 if(obj) {
   object[obj[key]] = {};
   convert(obj[key], object[obj[key]]);
 }
}

 function getObj(key) {
  const foo = start.find((el, i) => { if(el[key]) { return el[key] }});
  return foo;
}

const end = { a: {}};

convert('a', end.a);
 console.log(end);
...