javascript - 递归查找 JSON 值并返回对象
问题描述
我有一些嵌套的对象数据,我想搜索它并根据名称返回与父对象匹配的对象。
如果我想搜索孩子,我的代码效果很好,但是如果我开始搜索它的父(品牌和组织,媒体),我会得到一个空数组。
JSON
{
"categories": [
{
"id": 1,
"name": "Brands and Organizations",
"type": "dir",
"children": [
{
"id": 2,
"name":"Apple",
"parentId": 1,
"children": [
{
"id": 8,
"name":"Iphone",
"parentId": 2
}
]
},
{
"id":3,
"name":"Samsung",
"parentId": 1
}
]
},
{
"id": 4,
"name": "Media",
"type": "dir",
"children": [
{
"id": 5,
"name":"CD",
"parentId": 4
},
{
"id":6,
"name":"DVD",
"parentId": 4
}
]
},
{
"id": 7,
"name": "Inlfuenser",
"type": "dir",
"children": null
}
]
}
Javascript
function filterJson(categories, search) {
var matches = [];
if (!Array.isArray(categories)) return matches;
categories.forEach(function(category) {
if (category.name.includes(search)) {
matches.push(category);
} else {
let childResults = filterJson(category.children, search);
if (childResults.length)
matches.push(Object.assign({}, category, { children: childResults }));
}
})
return matches;
提前致谢!!!!!!
解决方案
我认为当您键入不同大小写的字符时会出现问题,您可以将搜索词转换为小写以解决该问题。
var object = {
"categories": [
{
"id": 1,
"name": "Brands and Organizations",
"type": "dir",
"children": [
{
"id": 2,
"name":"Apple",
"parentId": 1,
"children": [
{
"id": 8,
"name":"Iphone",
"parentId": 2
}
]
},
{
"id":3,
"name":"Samsung",
"parentId": 1
}
]
},
{
"id": 4,
"name": "Media",
"type": "dir",
"children": [
{
"id": 5,
"name":"CD",
"parentId": 4
},
{
"id":6,
"name":"DVD",
"parentId": 4
}
]
},
{
"id": 7,
"name": "Inlfuenser",
"type": "dir",
"children": null
}
]
};
function filterJson(categories, search) {
var search = search.toLowerCase().trim();
var matches = [];
if (!Array.isArray(categories)) return matches;
categories.forEach(function(category) {
if (category.name.toLowerCase().includes(search)) {
matches.push(category);
} else {
let childResults = filterJson(category.children, search);
if (childResults.length)
matches.push(Object.assign({}, category, { children: childResults }));
}
})
return matches;
}
function filter(value) {
console.log(value);
var matches = filterJson(object.categories, value);
console.log(matches);
document.getElementById('matches').innerHTML = JSON.stringify(matches);
}
<input type="text" onchange="filter(this.value)" />
<div id="matches"></div>
推荐阅读
- python-3.x - 如何使用pytest循环进入测试?
- encoding - 选择正确的编码格式
- elasticsearch - 使用 multi_match 搜索所有数据
- python - 我怎样才能正确地模仿这种加密方法来为 encryptedPwd 字段生成正确的值?
- woocommerce - 无法将数据发布到 woocommerce api
- python - 给定一个大小为 N 的列表 A,我如何创建一个列表 B,以便 B 的每个元素都是 A 和 B 的前一个元素的总和?
- java - 如何在 .jar 文件中查看 spark 作业中的源代码
- javascript - 如何解决“未捕获的 DOMException:无法在 DOMTokenList 上执行添加:
- python - 升级我的 Heroku 会解决我在运行 Flask 应用程序时遇到的问题吗?
- swift - Swift 中的内存管理和取消引用对象