javascript - 如何根据嵌套对象数组的对象搜索输入查找所有匹配值
问题描述
我正在寻找建议并修复我的功能。
我有一个函数来查找具有嵌套对象数组的对象数组的所有可能匹配项。
我尝试添加过滤器功能,但它只为我提供第一级匹配的关键字,之后它就停止了。
反正我可以搜索多个级别吗?
我尝试了以下方法。
const data = [
{
name: "testmapping",
items: [
{
name: "lv2test1mapping",
items: [
{ name: "lv3test1mapping" },
{ name: "lv3test2mapping" },
{ name: "lv3test3mapping" }
]
},
{
name: "lv2test2mapping"
},
{
name: "lv2test3mapping"
}
]
},
{
name: "test2mapping",
items: [
{
name: "lv2test21mapping",
items: [
{ name: "lv3test21mapping" },
{ name: "lv3test22mapping" },
{ name: "lv3test23mapping" }
]
},
{
name: "lv2test22mapping"
},
{
name: "lv2test23mapping"
}
]
}
];
function getvalue(searchText) {
return data.filter(item => {
return Object.keys(item).some(key => {
return String(item[key])
.toLowerCase()
.includes(searchText.toLowerCase());
});
});
}
console.log("one level", getvalue("test"));
//output
[
{
"name":"testmapping",
"items":[
{
"name":"lv2test1mapping",
"items":[
{
"name":"lv3test1mapping"
},
{
"name":"lv3test2mapping"
},
{
"name":"lv3test3mapping"
}
]
},
{
"name":"lv2test2mapping"
},
{
"name":"lv2test3mapping"
}
]
},
{
"name":"test2mapping",
"items":[
{
"name":"lv2test21mapping",
"items":[
{
"name":"lv3test21mapping"
},
{
"name":"lv3test22mapping"
},
{
"name":"lv3test23mapping"
}
]
},
{
"name":"lv2test22mapping"
},
{
"name":"lv2test23mapping"
}
]
}
]
console.log("second level", getvalue("lv2"));
//expected output
[
{
"name":"lv2test1mapping",
"items":[
{
"name":"lv3test1mapping"
},
{
"name":"lv3test2mapping"
},
{
"name":"lv3test3mapping"
}
]
},
{
"name":"lv2test2mapping"
},
{
"name":"lv2test3mapping"
},
{
"name":"lv2test21mapping",
"items":[
{
"name":"lv3test21mapping"
},
{
"name":"lv3test22mapping"
},
{
"name":"lv3test23mapping"
}
]
},
{
"name":"lv2test22mapping"
},
{
"name":"lv2test23mapping"
}
]
console.log("third level", getvalue("lv3"));
//expected output
[
{
"name":"lv3test1mapping"
},
{
"name":"lv3test2mapping"
},
{
"name":"lv3test3mapping"
},
{
"name":"lv3test21mapping"
},
{
"name":"lv3test22mapping"
},
{
"name":"lv3test23mapping"
}
]
解决方案
const data = [
{
name: "testmapping",
items: [
{
name: "lv2test1mapping",
items: [
{ name: "lv3test1mapping" },
{ name: "lv3test2mapping" },
{ name: "lv3test3mapping" }
]
},
{
name: "lv2test2mapping"
},
{
name: "lv2test3mapping"
}
]
},
{
name: "test2mapping",
items: [
{
name: "lv2test21mapping",
items: [
{ name: "lv3test21mapping" },
{ name: "lv3test22mapping" },
{ name: "lv3test23mapping" }
]
},
{
name: "lv2test22mapping"
},
{
name: "lv2test23mapping"
}
]
}
];
function getValue(searchText) {
const localData = [...data];
function getValueLogic(data, searchText) {
const arr = [];
if (data && Array.isArray(data)) {
for (let i = 0; i < data.length; i++) {
const ele = data[i];
ele && ele.name.includes(searchText)
? arr.push(ele)
: arr.push(...getValueLogic(ele.items, searchText));
}
}
return arr;
}
return getValueLogic(localData, searchText);
}
console.log("one level", getValue("test"));
console.log("second level", getValue("lv2"));
console.log("third level", getValue("lv3"));
console.log("Actual Data", data);
Recursion
是关键!以下功能应满足您的要求。
const data = [...] //your data
function getValue(searchText) {
const localData = [...data];
function getValueLogic(data, searchText) {
const arr = [];
if (data && Array.isArray(data)) {
for (let i = 0; i < data.length; i++) {
const ele = data[i];
ele && ele.name.includes(searchText)
? arr.push(ele)
: arr.push(...getValueLogic(ele.items, searchText));
}
}
return arr;
}
return getValueLogic(localData, searchText);
}
console.log("one level", getValue("test"));
console.log("second level", getValue("lv2"));
console.log("third level", getValue("lv3"));
console.log("Actual Data", data);
推荐阅读
- android - 导航栏android中的下拉菜单
- azure - 如何在 azure logic app 表达式替换函数中转义单引号(')
- javascript - 如何使用 javascript/typescript/angular5 对内部对象属性值执行累积和运算
- android - 处理 Internet 连接:特殊情况
- extjs - ExtJS:如何在 initComponent 中为 Grid 列设置默认值?
- android - 如何修复 Android Studio 上的警告“VM (2808009 kHz) 和主机 (2807995 kHz) 之间的 TSC 频率不匹配,并且 TSC 缩放不可用”
- tensorflow - 即使Rasa_nlu和tensorflow安装成功如何解决ImportError
- c++11 - 基于范围的for循环引用
- ios - NotificationCenter - 视图之间的文本传输
- javascript - Webscrape JS 呈现网站