【问题标题】:Javascript unflatten array/change datastructureJavascript 展开数组/更改数据结构
【发布时间】:2018-05-09 20:09:08
【问题描述】:

这就是问题所在,这是小提琴: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);

【问题讨论】:

  • 实际需要做什么?或者你想要达到什么目的?
  • 数据排序了吗?
  • 您想保持原始数组不变吗?我们可以使用和改变原始对象吗?
  • 还有e去哪儿了?
  • 如果数据也恰好包含{'e': 'a'}会发生什么?

标签: javascript arrays json data-structures


【解决方案1】:

我认为您在递归方面采取了相反的方式;我试了一下,这就是我到目前为止得到的结果

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

【讨论】:

  • 快到了...我看不出为什么没有在最终对象的根部添加一个:?
  • 我编辑了答案,必须更改转换第一个调用才能获得入口点
【解决方案2】:

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

此解决方案适用于未排序的数据。

为了获取根属性,所有的键和值都被收集,只取子集。

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

【讨论】:

  • 我知道这个问题缺乏细节,但有什么理由认为这是单根的吗?我正在走类似的道路,但意识到如果你将{x: 'b'} 扔到输入中,它就会在输出中消失。
  • @ScottSauyet,它现在可以工作了,但它对 b 的引用相同。
猜你喜欢
  • 2011-11-09
  • 1970-01-01
  • 2022-01-13
  • 2017-01-10
  • 2021-08-28
  • 2014-05-29
  • 2016-01-18
  • 2017-03-30
  • 1970-01-01
相关资源
最近更新 更多