Javascript 查询具有多个参数的数组

Javascript 查询具有多个参数的数组,javascript,filtering,lodash,Javascript,Filtering,Lodash,给定此帐户数组(包含500000多条记录的数组示例) 用户可以以任意组合查询以下字段:AccountNo、Status、Account和OrderID 现在,我可以很高兴地根据顶级中的一个字段进行筛选: var result = _.filter(accounts, function (a) { return (a.Account.toLowerCase().indexOf((query).toLowerCase()) !== -1) }); 因此,如果有人搜索“Big”,我将得到一个新数

给定此帐户数组(包含500000多条记录的数组示例)

用户可以以任意组合查询以下字段:AccountNo、Status、Account和OrderID

现在,我可以很高兴地根据顶级中的一个字段进行筛选:

var result = _.filter(accounts, function (a) {
  return (a.Account.toLowerCase().indexOf((query).toLowerCase()) !== -1)
});
因此,如果有人搜索“Big”,我将得到一个新数组,其中只包含示例的第一个条目,因为该帐户包含单词“Big”

但是,如何修改此筛选器以包括其他字段(不区分大小写是必须的),并返回一个新数组,其中包含找到任何结果组合的所有匹配帐户

例如:

  • 如果有人要搜索OrderID“121”,我希望两条记录都能返回
  • 如果有人要搜索帐户“大”,我会期待第一张记录回来
  • 如果有人要搜索帐户“框”,我希望第二条记录会回来
  • 如果有人要搜索帐户“B”和订单ID“444”,我希望两者都返回,因为B在帐户字段中

此外,为了使其更复杂,可能存在不存在订单的情况。

您可以使用或在return语句中写入其他参数

下面的示例将满足您的所有情况

var result = _.filter(accounts, function (a) {
  return (a.Account.toLowerCase().indexOf((query).toLowerCase()) !== -1 || a.Orders.OrderDetail.filter((ele)=>{if(Your query) return true; })[0]
)});
此行用于匹配订单中的查询。
我一找到元素就返回true,而筛选器返回数组,因此我使用[0]获取它的第一个元素。

这里有一个
通用的
递归的
搜索函数,在这种情况下,该函数仅限于您的特定字段。它实际上将对象展平并搜索所有字段,并将点击作为路径返回。我们只需将路径转换回末端的对象。lodash在这里的唯一用途是使用
从给定路径获取对象,但您也可以轻松获得ES6方法:

let obj={“Accounts”:{“Account”:[{“AccountNo”:“12345”,“Status”:“Active”,“Type”:“Supplier”,“Account”:“Big tile company”,“PermissionForSales”:“grated”,“Orders”:{“OrderDetail”:[{“Date”:“2018-09-05”,“OrderID”:“2018-04-09”,“OrderID”:“Nmp9812”}}}},{“AccountNo”:“98765”,“Status”:“Inactive”,“类型”:“供应商”、“账户”:“博克斯公司”、“销售许可”:“授予”、“订单”:{“订单详情”:[{“日期”:“2018-10-11”、“订单ID”:“Yrt172”}、{“日期”:“2018-04-01”、“订单ID”:“Hwr121”}}
常量搜索=(对象、文本、字段=['AccountNo'、'Status'、'Account'、'OrderID'])=>{
让点击率=[]
常量flatSearch=(对象,文本='',点击次数=[],arr=[],路径=空)=>
Object.entries(obj.forEach)([key,value])=>{
如果(值的类型=='object')
flatSearch(值、文本、点击、arr、路径?`${path}.${key}`:key)
其他的
if(fields.includes(key)和&value.toString().toLowerCase().includes(text.toLowerCase()))
hits.push([…path.split('.'),key])
})    
平面搜索(对象、文本、点击)
返回{Accounts:{Account:[…新集合(hits.map(x=>x.slice(0,3).join('-')))].map(x=>get(obj,x.split('-')))}
}
log(search(obj,'121')//两条记录
log(search(obj,'Big')//仅第一个
log(search(obj,'Box'))//仅第二个
log(搜索(obj,'B')//两条记录

当然,好的,我已经为AccountNo、Account和Status提供了一个Or的列表,然后我如何过滤sub orders数组?过滤器中是否有另一个过滤器?谢谢,这是基于我所追求的搜索,但我需要结果数组与源数组的结构相同。这将返回一个仅包含找到的值r的数组A超过识别匹配项的完整帐户结构。已更新。现在返回/构造相同的对象。
var result = _.filter(accounts, function (a) {
  return (a.Account.toLowerCase().indexOf((query).toLowerCase()) !== -1 || a.Orders.OrderDetail.filter((ele)=>{if(Your query) return true; })[0]
)});
a.Orders.OrderDetail.filter((ele)=>{if(Your query) return true; })[0]