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个字符。要讨论期望的结果:
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);