[英]Javascript deep nested array filter
我想使用javascript過濾器功能過濾一些信息,但似乎無法正常工作。 鑒於我有一些原始數據如下:
{
"salesWeeks": [
{
"date": "29/03/2019",
"locations": [
{
"name": "London",
"totalUnits": 15,
"cars": [
{
"name" : "Audi",
"units": 5
},
{
"name": "BMW",
"units": 10
}
]
}
]
},
{
"date": "29/03/2019",
"locations": [
{
"name": "Paris",
"totalUnits": 22,
"cars": [
{
"name" : "Audi",
"units": 2
},
{
"name": "BMW",
"units": 10
},
{
"name": "Porsche",
"units": 10
}
]
}
]
}
]
}
我想通過汽車名稱在UI中過濾此數據。 如果用戶選擇過濾器選項,該選項將返回帶有['Audi']的數組。
為了得到以下響應,我需要做什么:
{
"salesWeeks": [
{
"date": "29/03/2019",
"locations": [
{
"name": "London",
"totalUnits": 15,
"cars": [
{
"name" : "Audi",
"units": 5
}
]
}
]
},
{
"date": "29/03/2019",
"locations": [
{
"name": "Paris",
"totalUnits": 22,
"cars": [
{
"name" : "Audi",
"units": 2
}
]
}
]
}
]
}
我最好的猜測方法是:
https://jsfiddle.net/hwt3k2sn/7/
var salesWeeks = [{"date":"29/03/2019","locations":[{"name":"London","totalUnits":15,"cars":[{"name":"Audi","units":5},{"name":"BMW","units":10}]}]},{"date":"29/03/2019","locations":[{"name":"Paris","totalUnits":22,"cars":[{"name":"Audi","units":2},{"name":"BMW","units":10},{"name":"Porsche","units":10}]}]}]
salesWeeks = salesWeeks
.filter(week => {
return week.locations
.some(location => {
return location
.cars.filter(cars => { cars.name == "Audi" })
})
})
console.log(salesWeeks)
它似乎只是忽略了最后的過濾器:\\\\如果有人對此有修復,我將非常感謝您的幫助,對於那些精通Javascript方式的人來說,這可能相當簡單。
如果您的期望響應與原始原始數據的類型不同,則您需要更多運算符。
在您的情況下,我使用.map
函數來執行此操作:
var salesWeeks = [{"date":"29/03/2019","locations":[{"name":"London","totalUnits":15,"cars":[{"name":"Audi","units":5},{"name":"BMW","units":10}]}]},{"date":"29/03/2019","locations":[{"name":"Paris","totalUnits":22,"cars":[{"name":"Audi","units":2},{"name":"BMW","units":10},{"name":"Porsche","units":10}]}]}]
const CAR_BRANDS = ["Audi", "Porsche"];
salesWeeks = salesWeeks
.filter(week => {
return week.locations
.some(location => {
return !!location
.cars.filter(car => CAR_BRANDS.includes(car.name)).length // return a bolean value length = 0 => false...
})
})
.map(week => {
week.locations = week.locations.map(l => {
l.cars = l.cars.filter(car => CAR_BRANDS.includes(car.name)); // only keep a car
return l;
});
return week;
});
console.log(JSON.stringify(salesWeeks, null, 4));
嘗試這個。 很少的.some()
可能有所幫助。
const obj = { "salesWeeks": [ { "date": "29/03/2019", "locations": [ { "name": "London", "totalUnits": 15, "cars": [ { "name" : "Audi", "units": 5 } ] } ] }, { "date": "29/03/2019", "locations": [ { "name": "Paris", "totalUnits": 22, "cars": [ { "name" : "Toyota", "units": 2 }, { "name" : "Mercedes", "units": 5 } ] } ] } ] } const filterByCar = (arr, carBrand) => { return arr.filter(week => week.locations.some(loc => loc.cars.some(car => car.name === carBrand))) } console.log(filterByCar(obj.salesWeeks, 'Toyota'))
您可以使用Array.reduce()
做到這一點:
const salesWeeks = [{"date":"29/03/2019","locations":[{"name":"London","totalUnits":15,"cars":[{"name":"Audi","units":5},{"name":"BMW","units":10}]}]},{"date":"29/03/2019","locations":[{"name":"Paris","totalUnits":22,"cars":[{"name":"Audi","units":2},{"name":"BMW","units":10},{"name":"Porsche","units":10}]}]}] const filterByCar = (data, car) => data.reduce((acc, week) => { const locations = week.locations.map(l => ({ ...l, cars: l.cars.filter(c => c.name === car) })); if (locations.length && locations.some(l => l.cars && l.cars.length)) { acc.push({ ...week, locations }); } return acc; }, []); console.log(filterByCar(salesWeeks, 'Audi')); console.log(filterByCar(salesWeeks, 'Porsche')); console.log(filterByCar(salesWeeks, 'Whatever'));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.