我已经获得了许多不同字符模式的数组,请参阅下面的data
,我正在尝试将数据嵌套到分层JSON表单中,以插入到旭日形象中。每个模式由n
个字符组成,但下面的字符为8个字符。谈谈期望的结果:
children
的{{1}}属性。我能够为两个级别的案例构建代码,并且随后可以更深入地进行大量嵌套,但它将非常难以理解并且难以理解。有没有人知道我可以递归地使用另一种模式来解决它?
所需的输出样本:
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}]}]}
答案 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)
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);