我试图解析一个JSON结构,json结构看起来像这样:
{
children: [
{
type: "p",
children: [{
text: ""
}]
},
{
type: "social_embed",
children: [{
text: ""
}]
source_url: "some_url"
},
{
type: "p",
children: [{
type: "p",
children: [{
type: "p",
children: [{
text: ""
}]
}]
}]
},
]
}
输出将看起来像:
{
children: [
{
type: "p",
children: [{
text: ""
}]
},
{
type: "p",
children: [{
text: "some_url"
}]
},
{
type: "p",
children: [{
type: "p",
children: [{
type: "p",
children: [{
text: ""
}]
}]
}]
},
]
}
这是我正在尝试的代码:
if (currentBlock.type == "card" || currentBlock.type =="card_body")
{
parsedBlocks.map((block: any, index: any) => {
block.children = parseBlocks(block.children)
})
console.log("Blocks after parsing", parsedBlocks)
editor.insertFragment(parsedBlocks);
return true
}
const parseBlocks = (blocks: any): any => {
blocks.forEach((block: any) => {
console.log("Block ", block)
if (block.type == "social_embed") {
const newBlock = {
type: "p",
children: [
{
text: block.source_url
}
]
}
blocks[blocks.indexOf(block)] = newBlock
}
if (block.children) {
return parseBlocks(block.children)
}
})
return blocks
}
我希望递归遍历所有子对象,直到对象中没有children属性,当我遇到类型为“social_embed”的对象时,我希望将其替换为类型:“p”,并将文本作为源url并修改整个数组,子项可以有无限嵌套,但社交嵌入在其子项中除了{text:“}之外不能有任何内容
您可以执行一个递归函数,该函数在树上循环,并在树遇到社交嵌入时就地修改
const input = {children: [{type: "p",children: [{text: ""}]},{type: "social_embed",children: [{text: ""}], source_url: "some_url"},{type: "p",children: [{type: "p",children: [{type: "p",children: [{text: ""}]}]}]}]}
function rec(input) {
if (input.type === "social_embed") {
input.children = [{text: input.source_url}]
input.type = "p"
delete input.source_url
}
input.children?.forEach(rec)
}
rec(input)
console.log(JSON.stringify(input, null, 4))
css prettyprint-override">.as-console-wrapper { max-height: 100% !important; top: 0; }
这样的东西怎么样:
const parse = node => {
if (node.type === "social_embed") {
return {
type: "p",
children: [{ text: node.source_url}]
}
}
return node.children ? {
...node,
children: node.children.map(parse)
} : node;
}
https://replit.com/@jamiedixon/ParseTree#索引。js
如果您想更进一步,您可以根据type
定义节点的访问者,并以这种方式处理它们。
const socialEmbed = node => ({
type: "p",
children: [{ text: node.source_url }]
})
const visitors = {
"social_embed": [socialEmbed]
}
const parse = node => {
const _visitors = visitors[node.type] || [x => x];
const result = _visitors.reduce((agg, fn) => fn(agg), node);
return result.children ? {
...result,
children: result.children.map(parse)
} : result;
}
https://replit.com/@jamiedixon/ParseTree#visitors.js
您可以将新对象映射到子对象,并从旧对象中选择一个新对象。
js lang-js prettyprint-override">const
update = ({ children = [], ...object }) => {
if (object.type === "social_embed") {
const
type= 'p',
text = object.source_url;
return { type, children: [{ text }] };
}
children = children.map(update);
return children.length
? { ...object, children }
: object;
},
tree = { children: [{ type: "p", children: [{ text: "" }] }, { type: "social_embed", children: [{ text: "" }], source_url: "some_url" }, { type: "p", children: [{ type: "p", children: [{ type: "p", children: [{ text: "" }] }] }] }] };
tree.children = tree.children.map(update);
console.log(tree);
.as-console-wrapper { max-height: 100% !important; top: 0; }
所以我在研究树遍历算法。例如,在K-d树遍历中,我们的目标是遍历节点直至叶子。这与其说是一个树搜索,不如说是一个根到叶的遍历。 在这种情况下,递归解决方案就足够了。但是,在C等语言中,递归调用函数需要将值推送到堆栈上,并在堆栈帧之间跳跃等。标准的递归方法类似于: 因此,考虑到二叉树有一个明确的上界(我相信这也可以扩展到其他树类型),以迭代方式执行此遍历是否更有效: 二叉树的最大高度是它的节点数,而
我试图写一个递归函数来产生一个数组的所有排列。 它作为调用,应该会产生所有的排列,但这并不起作用。我该怎么修好它?
我有一个对象数组,如下所示: 我想把它添加到一个退出的对象中,其中id是该对象的一个键,如下所示:
问题内容: 有没有一种方法(在jQuery或JavaScript中)循环遍历每个对象以及子对象和孙子对象等等? 如果是的话…我还能读他们的名字吗? 例: 所以循环应该做这样的事情… 问题答案: 您正在寻找循环: 请注意,循环将遍历任何可枚举的属性,包括那些添加到对象原型的属性。为了避免作用于这些属性,可以使用方法检查该属性是否仅属于该对象: 递归执行循环就像编写递归函数一样简单:
问题内容: 我正在使用Runnable每秒自动从玩家的冷却时间中减去20,但是我不知道如何在迭代过程中替换值。如何更新每个键的值? 问题答案: 使用Java 8: 使用Java 7或更旧版本: 您可以迭代条目并更新值,如下所示:
我的问题是关于如何在React JSX中部分迭代数组。而不是打电话。映射并迭代配置文件中的所有项目。类别,我只想显示数组中的前五项。我目前拥有以下代码: