字符串JSON的字符序列 - d3.sunburst

时间:2016-04-08 19:06:32

标签: javascript json node.js d3.js

我已经获得了许多不同字符模式的数组,请参阅下面的data,我正在尝试将数据嵌套到分层JSON表单中,以插入到旭日形象中。每个模式由n个字符组成,但下面的字符为8个字符。谈谈期望的结果:

  1. 在0级,查找有多少个唯一字符。答案:[' w',' m']。
  2. 拿第一把钥匙' w'并找到级别1的所有唯一字符,然后转到级别2,依此类推,直到达到模式的结尾,我们在最后计算该唯一模式的大小。
  3. 对第二个键' m'
  4. 重复#2
  5. 将结果插入children的{​​{1}}属性。
  6. 我能够为两个级别的案例构建代码,并且随后可以更深入地进行大量嵌套,但它将非常难以理解并且难以理解。有没有人知道我可以递归地使用另一种模式来解决它?

    所需的输出样本:

    root

    两级嵌套(寻找n级嵌套)

    var root = {"name":"evt_seq","children":[{"name":"w","children":[{"name":"w","size":8},{"name":"k","size":1}]},{"name":"m","children":[{"name":"w","size":1}]}]}
    

2 个答案:

答案 0 :(得分:2)

这绝对是通过递归算法最好地解决的。由于语法似乎不太重要,我只是给出简短的psudeo代码:

function subTree(inputs) {
    var children = []
    var leadingLetters = //map first letter from each array, remove duplicates
    for leadingLetter in leadingLetters {
        var matchingInputs = //filter inputs that match the first letter
        var reducedInputs = //copy of matchingInputs, but the first (matching) element is removed from each array
        children.push(subTree(reducedInputs))
    }
    return children
}
var root = subTree(data);

我没有将空子数组处理为null,因为当你到达字符串的末尾时,我并不完全确定它是什么。无论哪种方式,这应该让你在路上。 (PS希望这不是作业作业!= X)

答案 1 :(得分:0)

@Acey-很棒的指导!请参阅下面的完整工作实施。再次感谢,这是个人项目,而不是作业:)

function subTree(inputs) {
    var children = [];
    var leadingLetters = _.uniq(_.map(inputs, function (d) {
        return d.match[0];
    })); //map first letter from each array, remove duplicates
    _.forEach(leadingLetters, function (leadingLetter) {
            var matchingInputs = _.filter(inputs, function (d) {
                return d.match[0] == leadingLetter;
            }); //filter inputs that match the first letter
            var reducedInputs = _.map(matchingInputs, function (d) {
                return {"match": d.match.slice(1, d.match.length)};
            }); //copy of matchingInputs, but the first (matching) element is removed from each array
            if (!reducedInputs[0].match.length) {
                children.push({name: leadingLetter, size: reducedInputs.length});
            }
            else {
                children.push({"name": leadingLetter, children: subTree(reducedInputs)});
            }
        }
    );
    return children
}

var root = subTree(data);