我已经得到了许多不同的char模式数组,请参阅下面的data,我正在尝试将数据嵌套到分层JSON形式中,以便插入到太阳暴晒可视化中。每个模式都是由n字符组成的,尽管下面的字符是8个字符。说出想要的结果:
children属性root中。我能够为两个级别的情况构造代码,随后可以更深入地进行嵌套,但这将是非常硬编码的,而且非常难以理解。有没有人知道我可以用递归的方式或者用另一种模式来解决这个问题呢?
期望输出样本:
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级嵌套)
"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));发布于 2016-04-08 20:46:19
用递归算法解决这个问题肯定是最好的。由于语法似乎不那么重要,我只给出简短的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,因为我不完全确定当您到达字符串末尾时所期望的是什么。不管怎样,这应该会让你上路的。(希望这不是作业作业!)
发布于 2016-04-09 01:29:04
@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);https://stackoverflow.com/questions/36507417
复制相似问题