Javascript unflatten数组/更改数据结构

时间:2018-05-09 20:09:08

标签: javascript arrays json data-structures

所以这是问题所在,并且是小提琴: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 :(得分:1)

我认为你反过来接受了递归的方法;我试了一下,这就是我到目前为止所得到的。

{{1}}

答案 1 :(得分:0)

您可以使用对象结构来收集数据并构建树。

此解决方案适用于未分类的数据。

为了获取根属性,将收集所有键和值,并且仅采用子集。



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; }