首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >到分级JSON -d3. d3.sunburst的Char序列

到分级JSON -d3. d3.sunburst的Char序列
EN

Stack Overflow用户
提问于 2016-04-08 19:06:32
回答 2查看 228关注 0票数 0

我已经得到了许多不同的char模式数组,请参阅下面的data,我正在尝试将数据嵌套到分层JSON形式中,以便插入到太阳暴晒可视化中。每个模式都是由n字符组成的,尽管下面的字符是8个字符。说出想要的结果:

  1. 在0级,找出有多少个独特的字符。答:“W”,“m”。
  2. 取第一个键'w‘,找到所有在第1级的唯一字符,然后转到第2级,等等,直到到达一个模式的末尾,在该模式的末尾,我们计算出该唯一模式的大小。
  3. 对第二个键m重复#2
  4. 将结果插入到children属性root中。

我能够为两个级别的情况构造代码,随后可以更深入地进行嵌套,但这将是非常硬编码的,而且非常难以理解。有没有人知道我可以用递归的方式或者用另一种模式来解决这个问题呢?

期望输出样本:

代码语言:javascript
复制
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级嵌套)

代码语言:javascript
复制
"use strict";
var data = [{"match": ["w", "w", "l", "w", "w", "w", "t", "w"]}, {"match": ["w", "k", "w", "A", "w", "w", "w", "w"]},
{"match": ["w", "w", "w", "w", "w", "w", "w", "w"]}, {"match": ["w", "w", "w", "w", "w", "w", "w", "w"]},
{"match": ["w", "w", "w", "w", "w", "w", "w", "w"]}, {"match": ["m", "w", "v", "v", "t", "m", "l", "m"]},
{"match": ["w", "w", "w", "l", "w", "w", "l", "l"]}, {"match": ["w", "w", "z", "w", "w", "m", "l", "w"]},
{"match": ["w", "w", "w", "w", "w", "w", "w", "w"]}, {"match": ["w", "w", "m", "w", "l", "w", "w", "w"]}
];

var root = {
    "name": "evt_seq", children: []
};
// Get initial pattern
var groupedXs = _.groupBy(data, function (d) {
    return d.match[0];
});
_.forEach(_.keys(groupedXs), function (d) {
    let _x = groupedXs[d];
    let _groupedXs = _.groupBy(_x, function (f) {
        return f.match[1];
    });
    let _children = _.map(_.keys(_groupedXs), function (f) {
        return {'name': f, 'size': _groupedXs[f].length}
    });
    root.children.push({"name": d, children: _children});
});
console.log(JSON.stringify(root));
EN

回答 2

Stack Overflow用户

发布于 2016-04-08 20:46:19

用递归算法解决这个问题肯定是最好的。由于语法似乎不那么重要,我只给出简短的psudeo代码:

代码语言:javascript
复制
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,因为我不完全确定当您到达字符串末尾时所期望的是什么。不管怎样,这应该会让你上路的。(希望这不是作业作业!)

票数 2
EN

Stack Overflow用户

发布于 2016-04-09 01:29:04

@Acey -伟大的指导!关于充分发挥作用的实施情况,见下文。再次感谢,这是一个个人项目而不是家庭作业:)

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36507417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档