[英]Javascript | Filtering in nested arrays
我需要过滤以下数据,用户在输入中键入的文本,但仅限于 3 个键(日期、披萨和大小)
var pizzaData = [{
"id": 1,
"date": "2020-03-20",
"order": [
{"pizza": "chicken", "comment": "No onion", "size": "personal"},
{"pizza": "cheese", "comment": "", "size": "medium"}
]}, {
"id": 2,
"date": "2020-03-21",
"order": [
{"pizza": "veggie", "comment": "Extra cheese", "size": "big"}
]}, {
"id": 3,
"date": "2020-03-22",
"order": [
{"pizza": "Pepperoni", "comment": "", "size": "big"},
{"pizza": "Double cheese", "comment": "", "size": "big"},
{"pizza": "BBQ chicken", "comment": "", "size": "small"},
{"pizza": "Mushrooms", "comment": "", "size": "big"}
]}, {
"id": 4,
"date": "2020-03-25",
"order": [
{"pizza": "cheese", "comment": "", "size": "small"}
]}
]
我正在使用 angularjs,我尝试使用 $filter,在 js 中创建过滤器和过滤器方法,但我只能在“订单”数组中获取第一个 object。 该代码应该可以在 Chrome、Mozilla 和 Explorer 11 中运行
我正在尝试实现这样的目标
input = "cheese"
pizzaData = [{
"id": 1,
"date": "2020-03-20",
"order": [
{"pizza": "chicken", "comment": "No onion", "size": "personal"},
{"pizza": "cheese", "comment": "", "size": "medium"}
]}, {
"id": 4,
"date": "2020-03-25",
"order": [
{"pizza": "cheese", "comment": "", "size": "small"}
]}
]
input = 2020-03-21
pizzaData = [{
"id": 2,
"date": "2020-03-21",
"order": [
{"pizza": "veggie", "comment": "Extra cheese", "size": "big"}
]}
]
input = onion
pizzaData = []
您可以按每个顺序创建一个包含要搜索的所有值的字符串,并检查该字符串中的搜索键。
var pizzaData = [{ "id": 1, "date": "2020-03-20", "order": [ {"pizza": "chicken", "comment": "No onion", "size": "personal"}, {"pizza": "cheese", "comment": "", "size": "medium"} ]}, { "id": 2, "date": "2020-03-21", "order": [ {"pizza": "veggie", "comment": "Extra cheese", "size": "big"} ]}, { "id": 3, "date": "2020-03-22", "order": [ {"pizza": "Pepperoni", "comment": "", "size": "big"}, {"pizza": "Double cheese", "comment": "", "size": "big"}, {"pizza": "BBQ chicken", "comment": "", "size": "small"}, {"pizza": "Mushrooms", "comment": "", "size": "big"} ]}, { "id": 4, "date": "2020-03-25", "order": [ {"pizza": "cheese", "comment": "", "size": "small"} ]} ] function getOrder(key) { return pizzaData.filter((eachOrder) => { let text = [eachOrder.date]; text = text.concat(eachOrder.order.map(({pizza, size}) => ([pizza, size]))); return text.join(' ').includes(key); }) } console.log('2020-03-21 => ', getOrder('2020-03-21')) console.log("cheese => ", getOrder("cheese"))
var pizzaData = [{ "id": 1, "date": "2020-03-20", "order": [ {"pizza": "chicken", "comment": "No onion", "size": "personal"}, {"pizza": "cheese", "comment": "", "size": "medium"} ]}, { "id": 2, "date": "2020-03-21", "order": [ {"pizza": "veggie", "comment": "Extra cheese", "size": "big"} ]}, { "id": 3, "date": "2020-03-22", "order": [ {"pizza": "Pepperoni", "comment": "", "size": "big"}, {"pizza": "Double cheese", "comment": "", "size": "big"}, {"pizza": "BBQ chicken", "comment": "", "size": "small"}, {"pizza": "Mushrooms", "comment": "", "size": "big"} ]}, { "id": 4, "date": "2020-03-25", "order": [ {"pizza": "cheese", "comment": "", "size": "small"} ]} ] function search(data){ let searchData=[]; if(data.split("-").length==3){ for(var i=0;i<pizzaData.length;i++){ if(pizzaData[i].date==data){ searchData.push(pizzaData[i]); } } return searchData; } for(var i=0;i<pizzaData.length;i++){ let orders=pizzaData[i].order; for(var j=0;j<orders.length;j++){ if(orders[j].pizza.toLowerCase().match(data.toLowerCase()) || orders[j].size.toLowerCase().match(data.toLowerCase())){ searchData.push(pizzaData[i]); } } } return searchData; } console.log(search("2020-03-21")); console.log(search("cheese"));
var pizzaData = [{
"id": 1,
"date": "2020-03-20",
"order": [
{"pizza": "chicken", "comment": "No onion", "size": "personal"},
{"pizza": "cheese", "comment": "", "size": "medium"}
]}, {
"id": 2,
"date": "2020-03-21",
"order": [
{"pizza": "veggie", "comment": "Extra cheese", "size": "big"}
]}, {
"id": 3,
"date": "2020-03-22",
"order": [
{"pizza": "Pepperoni", "comment": "", "size": "big"},
{"pizza": "Double cheese", "comment": "", "size": "big"},
{"pizza": "BBQ chicken", "comment": "", "size": "small"},
{"pizza": "Mushrooms", "comment": "", "size": "big"}
]}, {
"id": 4,
"date": "2020-03-25",
"order": [
{"pizza": "cheese", "comment": "", "size": "small"}
]} ]
const searchData = keywords => {
const filteredData = pizzaData.filter(pizza => {
const filteredOrder = pizza.order.filter(({pizza, size}) => {
return (pizza === keywords || size === keywords)
})
return (pizza.date === keywords || !!
(filteredOrder.length))
})
return filteredData
}
console.log(searchData('small'))
上面的答案很棒,我正在分享我的尝试。 我正在使用filter
function 并在其中使用some
来检测任何匹配情况(按订单):
var pizzaData = [{ "id": 1, "date": "2020-03-20", "order": [ {"pizza": "chicken", "comment": "No onion", "size": "personal"}, {"pizza": "cheese", "comment": "", "size": "medium"} ]}, { "id": 2, "date": "2020-03-21", "order": [ {"pizza": "veggie", "comment": "Extra cheese", "size": "big"} ]}, { "id": 3, "date": "2020-03-22", "order": [ {"pizza": "Pepperoni", "comment": "", "size": "big"}, {"pizza": "Double cheese", "comment": "", "size": "big"}, {"pizza": "BBQ chicken", "comment": "", "size": "small"}, {"pizza": "Mushrooms", "comment": "", "size": "big"} ]}, { "id": 4, "date": "2020-03-25", "order": [ {"pizza": "cheese", "comment": "", "size": "small"} ]} ]; let filterPizza=(filterData)=>{ result=pizzaData.filter((value)=> value.date == filterData || value.order.some((elem)=>elem.pizza.toUpperCase()==filterData.toUpperCase() || elem.size.toUpperCase()==filterData.toUpperCase())) return result; } console.log(filterPizza('cheese')); console.log(filterPizza('2020-03-21'));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.