Javascript如何筛选与关键字匹配的数组
我有一个深度嵌套的数组,如下所示:Javascript如何筛选与关键字匹配的数组,javascript,search,Javascript,Search,我有一个深度嵌套的数组,如下所示: {[{ id: "1", experts: [ {instruments: [{guitar: ["John", "Maria"], piano: ["Hans", "Sarah", "Nancy"] }], name: "Columbia Records", published: "1930" }, {instruments:
{[{
id: "1",
experts: [
{instruments: [{guitar: ["John", "Maria"],
piano: ["Hans", "Sarah", "Nancy"] }],
name: "Columbia Records", published: "1930"
},
{instruments: [{guitar: ["Pablo"],
drums: ["Jeb", "Xiao"]} ],
name: "Atlas Records", published: "1978"
}
]
]},
{
id: "2",
experts: [
{instruments: [{sitar: ["Anaka", "Reha"],
chello: ["Hans", "Raphael", "Stuart"]} ],
name: "Touchstone Records", published: "1991"
},
{instruments: [{viola: ["Richard", "Farah"],
buss: ["Tina", "Max"]} ],
name: "Atlas Records", published: "1978"
}
]
}
我需要执行分级搜索。例如,如果我的搜索键为“Jo”,则结果应为:
[{
id: "1",
experts: [{"instruments": [
"guitar": ["John"]
]
],
"name": "Columbia Records", "published": "1930"
}]
换句话说,对于每个嵌套级别,我只是基于键进行过滤,如果它不存在,则删除嵌套对象并继续。如果搜索键为“1”,它将返回整个第一个对象
我正在研究loadsh及其过滤器函数,它接受一个谓词,但不确定如何实现搜索任意嵌套 这里看起来很有趣。首先,您的对象声明有很多错误。您缺少结束标记,并且您没有创建带有键的数组,如
[“key”:“value”]
,这是用于对象的{“key”:“value”}
一种方法是使用递归,例如:
function deepSearchForValue(obj, searchstring) {
var doesValueExist = function(item) {
if (typeof item === "string") {
return item.toLowerCase().indexOf(searchstring.toLowerCase()) >= 0;
} else {
return doesValueExistRecursive(item);
}
}
var doesValueExistRecursive = function(item) {
for (i in item) {
if (doesValueExist(item[i])) {
return true;
}
}
return false;
}
return obj.filter(doesValueExistRecursive);
}
你会这么说吗
var matchedItems = deepSearchForValue(testArray, "reh");
console.log("found:");
console.log(matchedItems);
你可能会想要这样的东西。可能需要对algo进行一些修改,以获得您真正想要的:
var-arr=[
{
id:“1”,
专家们:[
{
“文书”:{
“吉他”:[“约翰”、“玛丽亚”],
“钢琴”:[“汉斯”、“莎拉”、“南希”]
},
“姓名”:“哥伦比亚唱片公司”,
“出版”:“1930”
},
{
“文书”:{
“吉他”:[“巴勃罗”],
“鼓”:[“杰布”,“肖”]
},
“名称”:“阿特拉斯记录”,
“出版”:“1978年”
}
]
},
{
id:“2”,
专家们:[
{
“文书”:{
“锡塔”:[“阿纳卡”、“瑞哈”],
“切洛”:[“汉斯”、“拉斐尔”、“斯图尔特”]
},
“名称”:“试金石记录”,
“已出版”:“1991年”
},
{
“文书”:{
“中提琴”:[“理查德”,“法拉”],
“巴斯”:[“蒂娜”,“马克斯”]
},
“名称”:“阿特拉斯记录”,
“出版”:“1978年”
}
]
}];
var t=u0.remove(arr,函数(n){
如果(!(包括(n,'Jo')){
返回n;
}
});
document.getElementById('search').innerHTML=JSON.stringify(t)代码>
JS-Bin
我想说递归是你的朋友这是无效的:[“吉他”:[“John”,“Maria”]
,提供你的固定代码和拧紧的括号{[{id:“1”/*.*/]},
你查过洛达斯了吗?在这种情况下,有很多助手可能会对你有用。首先,你怎么会有这么复杂的结构?我相信它甚至都无效?谢谢!非常接近我需要的,除了我还想弹出“chello”:[“Hans”、“Raphael”、“Stuart”]还有。我想我需要另一个层次的递归?你说的“pop the chello”是什么意思?是的,你可以编写另一个递归函数来删除/删除并按键返回项。你有基础,所以应该不会太棘手。
var matchedItems = deepSearchForValue(testArray, "reh");
console.log("found:");
console.log(matchedItems);