Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将字符序列转换为分层JSON-d3.sunburst_Javascript_Json_Node.js_D3.js - Fatal编程技术网

Javascript 将字符序列转换为分层JSON-d3.sunburst

Javascript 将字符序列转换为分层JSON-d3.sunburst,javascript,json,node.js,d3.js,Javascript,Json,Node.js,D3.js,我得到了一个包含许多不同字符模式的数组,请参见下面的data,我正在尝试将数据嵌套到一个层次结构的JSON表单中,以便插入到sunburst可视化中。每个模式由n个字符组成,尽管下面的是8个字符。要讨论期望的结果: 在0级,找到有多少个独特的角色。回答:['w','m'] 使用第一个键“w”,找到级别1的所有唯一字符,然后转到级别2,依此类推,直到到达图案的末端,在该末端我们计算该唯一图案的大小 对第二个键“m”重复#2 将结果插入到root的children属性中 我能够为两个级别的案例构造代

我得到了一个包含许多不同字符模式的数组,请参见下面的
data
,我正在尝试将数据嵌套到一个层次结构的JSON表单中,以便插入到sunburst可视化中。每个模式由
n
个字符组成,尽管下面的是8个字符。要讨论期望的结果:

  • 在0级,找到有多少个独特的角色。回答:['w','m']
  • 使用第一个键“w”,找到级别1的所有唯一字符,然后转到级别2,依此类推,直到到达图案的末端,在该末端我们计算该唯一图案的大小
  • 对第二个键“m”重复#2
  • 将结果插入到
    root
    children
    属性中
  • 我能够为两个级别的案例构造代码,并且可以通过大量嵌套进一步深入,但这将是非常硬编码的,并且非常难以理解。有人知道我可以递归地或者用另一种模式来解决这个问题吗

    所需输出样本:

    var root = {"name":"evt_seq","children":[{"name":"w","children":[{"name":"w","size":8},{"name":"k","size":1}]},{"name":"m","children":[{"name":"w","size":1}]}]}
    
    两级嵌套(查找n级嵌套)


    用递归算法肯定能最好地解决这个问题。由于语法似乎不那么重要,我将只给出简短的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);
    

    我没有将空的children数组处理为null,因为我不完全确定当到达字符串末尾时会发生什么。不管怎样,这都会让你走上正轨。(PS希望这不是家庭作业!=X)

    这肯定是递归算法最好的解决方法。由于语法似乎不那么重要,我将只给出简短的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);
    

    我没有将空的children数组处理为null,因为我不完全确定当到达字符串末尾时会发生什么。不管怎样,这都会让你走上正轨。(PS希望这不是家庭作业!=X)

    @Acey-很好的指导!请参见下面的完整工作实现。再次感谢,这是一个个人项目,而不是家庭作业:)


    @亚齐-伟大的指导!请参见下面的完整工作实现。再次感谢,这是一个个人项目,而不是家庭作业:)


    谢谢你的帮助@Acey!谢谢你的帮助@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);