
本文介绍了如何在JavaScript中递归搜索嵌套对象,并返回与给定字符串列表匹配的对象。通过使用生成器函数,我们可以高效地遍历对象结构,并提取出满足特定条件的部分,并提供了一个高阶函数,允许使用自定义谓词进行搜索。此外,还介绍了如何扩展该方法以支持顺序键搜索,从而可以查找具有特定键序列的对象。
在处理复杂的数据结构时,经常需要在嵌套的对象中查找特定的信息。本文将介绍一种使用JavaScript实现递归搜索的方法,该方法可以根据提供的字符串列表,返回所有匹配的对象。我们将使用生成器函数,以实现更高效的遍历和提取。
首先,我们定义一个生成器函数search1,该函数接受一个对象和一个搜索值作为参数。该函数会递归地遍历对象,并在找到匹配的键时,返回对应的值。
function* search1(data, value) {
if (Object(data) === data) {
for (const key of Object.keys(data)) {
if (key === value)
yield data[key];
else
yield* search1(data[key], value);
}
}
}这个函数使用 yield 关键字,使其成为一个生成器函数。这意味着它不会一次性返回所有结果,而是每次调用 next() 方法时,返回一个结果。这在处理大型对象时,可以提高性能。
接下来,我们定义一个 search 函数,该函数接受一个对象和一个搜索值列表作为参数。它会遍历搜索值列表,并对每个值调用 search1 函数。
function* search(data, values) {
for (const value of values)
yield* search1(data, value);
}这个函数也使用了 yield* 关键字,用于委托给另一个生成器函数。这意味着 search 函数会依次产生 search1 函数产生的所有值。
现在,我们可以使用这两个函数来搜索我们的数据。
const data = {
"tabs-1": {
"test 1": {
"test 2": {
"test 3a": {
"tab1graph1": {
"String a": "value a",
"String b": "value b",
"String c": "value c"
}
},
"test 3b": {
"tab1graph2": {
"String a": "value a",
"String b": "value b",
"String c": "value c"
}
},
"test 3c": {
"tab1graph3": {
"String a": "value a",
"String b": "value b",
"String c": "value c"
}
}
}
}
}
};
var searchList = ["apple", "testx3", "test 3b", "test 3a"];
for (const result of search(data, searchList))
console.log(result);这段代码会输出所有键匹配 searchList 中的值的对象。
为了使搜索更加灵活,我们可以使用高阶函数和一个谓词函数。谓词函数是一个返回布尔值的函数,用于测试一个值是否满足特定条件。
function* search(data, predicate) {
if (Object(data) === data) {
for (const entry of Object.entries(data)) {
if (predicate(entry))
yield entry[1];
else
yield* search(entry[1], predicate);
}
}
}在这个版本的 search 函数中,我们接受一个谓词函数作为参数。该函数接受一个键值对作为参数,并返回一个布尔值,指示该键值对是否应该被返回。
现在,我们可以使用这个函数来搜索我们的数据,并使用一个谓词函数来过滤结果。
Array.from(
search(
data,
([key, value]) => searchList.includes(key)
)
);这段代码使用 Array.from 函数将生成器函数返回的结果转换为一个数组。谓词函数 ([key, value]) => searchList.includes(key) 检查键是否在 searchList 中。
有时,我们需要查找具有特定键序列的对象。例如,我们可能需要查找 key1 -> key2 的对象。为了支持这种类型的搜索,我们需要修改 search1 函数,使其接受一个路径数组作为参数。
function* search1(data, path) {
if (path.length === 0)
yield data;
else if (Object(data) === data) {
for (const key of Object.keys(data)) {
if (key === path[0])
yield* search1(data[key], path.slice(1));
else
yield* search1(data[key], path);
}
}
}在这个版本的 search1 函数中,我们接受一个路径数组作为参数。如果路径数组为空,则我们返回当前数据。否则,我们遍历对象的键,并检查当前键是否与路径数组的第一个元素匹配。如果匹配,则我们递归调用 search1 函数,并将路径数组的剩余部分作为参数。
现在,我们可以使用这个函数来搜索我们的数据,并查找具有特定键序列的对象。
function* search(data, paths) {
for (const path of paths)
yield* search1(data, path);
}
for (const result of search(data, [
["test 1", "test 3a"], // test 1 -> test 3a
["test 2", "String a"] // test 2 -> String a
]) {
console.log(result)
}这段代码会输出所有匹配 ["test 1", "test 3a"] 或 ["test 2", "String a"] 路径的对象。
本文介绍了如何使用JavaScript递归搜索嵌套对象,并返回与给定字符串列表匹配的对象。我们使用了生成器函数,以实现更高效的遍历和提取。我们还介绍了一个高阶函数,允许使用自定义谓词进行搜索。此外,我们还介绍了如何扩展该方法以支持顺序键搜索,从而可以查找具有特定键序列的对象。
注意事项:
通过本文的学习,您应该能够掌握在JavaScript中搜索嵌套对象的有效方法,并能够根据实际需求进行定制和扩展。
以上就是在嵌套对象中查找匹配字符串列表的对象的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号