javascript - 使用 for...in 循环时如何中断递归
问题描述
const find = (json) => {
let result;
for (const key in json) {
if(typof json[key] === "number") {
result = json[key];
break;
} else {
find(json[key])
}
return result;
}
上面的代码有助于找到类型为 number 的属性的值,我是否有机会打破 for..in 而不继续递归直到它结束并访问我在上面的代码中尝试做的值。请让我知道在嵌套 JSON 中访问特定值并在实现后中断循环的理想方法。
解决方案
在做递归函数时,有几个关键的事情:
- 必须始终存在终止条件(如果您的情况,则为具有数字值的属性)
- 如果函数找到终止条件,它会返回一些内容,表明找到了条件(通常通过返回您正在寻找的值)。
- 如果函数发现它应该递归,它会调用自己,然后检查调用自己的结果,以防递归调用找到终止条件。
- 如果是,则返回从递归调用返回的值。
- 如果函数既没有找到终止条件也没有递归,则返回一个表明该事实的值。
看评论:
const find = (obj) => {
for (const key in obj) {
const value = obj[key];
if (typeof value === "number") {
// Found one -- return it (this is #2)
return value;
} else if (value && typeof value === "object") {
// Found an object -- recurse (this is #3)
const result = find(value);
// Did recursion find a number?
if (typeof result === "number") {
// Yes, return it (this is #3.1)
return result;
}
}
}
// Nothing found, return `undefined` (explicitly or implicitly)
// This is #4
// This is explicitly: `return undefined;`
};
请注意,我更改json
为obj
. 它显然不是 JSON(字符串)。
现场示例:
const find = (obj) => {
console.log(`Looking in ${JSON.stringify(obj)}`);
for (const key in obj) {
const value = obj[key];
if (typeof value === "number") {
// Found one -- return it (this is #2)
console.log(`Found ${value}, returning it`);
return value;
} else if (value && typeof value === "object") {
// Found an object -- recurse (this is #3)
console.log(`Found object, recursing`);
const result = find(value);
// Did recursion find a number?
if (typeof result === "number") {
// Yes, return it (this is #3.1)
console.log(`Recursive call found it`);
return result;
}
}
}
// Nothing found, return `undefined` (explicitly or implicitly)
// This is #4
// This is explicitly: `return undefined;`
console.log(`Didn't find anything`);
};
// Found at the top level:
console.log(find({answer: 42}));
// Found nested
console.log(find({
s: "string",
o: {
n: null,
o: {
s: "string",
answer: 42,
},
},
n: null,
}));
// Not found
console.log(find({}));
.as-console-wrapper {
max-height: 100% !important;
}
推荐阅读
- api - Instagram API 端点:GET /locations/search 距离参数
- c - 将文件从 C 服务器发送到使用 curl 的客户端
- rust - 我如何存储闭包并将它们与 Actix 演员一起使用?
- python - 如何将数据框日期与保持工作日和假期分开的行和列的值进行比较
- python - 如何计算 DataFrame 中连续 TRUE 的数量?
- r - R:在多个条件下改变行
- matlab - Matlab中的散点图:同一类颜色相同
- multithreading - Golang线程不是每次都执行
- cordova - Kotlin 用于基于 Cordova/Ionic 的插件
- node.js - 节点 mysql2 async-await try catch