Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript如何筛选与关键字匹配的数组_Javascript_Search - Fatal编程技术网

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);