[英]Using Lodash chaining, how can I return a filtered array of objects while mapping over an object of arrays
我有 object 的過濾器,看起來像這樣:
var filterUpdate = {
assetClass: [{id: 1, name: 'photo'}, {id: 2, name: 'thumbnail'} ]
vehicleType: [{id: 1, name: 'nissan'}]
}
我有這樣的 state 數據(代表年份的鍵是動態的並且可以更改):
this.state.filteredOwnership = {
2020: [],
2021: [{assetClass: 'thumbnail', vehicleType: 'Toyota' }, {assetClass: 'Abs', vehicleType: 'Prius' }]
2022: [{assetClass: 'thumbnail', vehicleType: 'Toyota' }, {assetClass: 'photo', vehicleType: 'Prius' }, {assetClass: 'Abs', vehicleType: 'nissan'}, {assetClass: 'LMO', vehicleType: 'Tesla'} ]
}
這是目前的 lodash 鏈:
const filterData = _filter(filteredOwnership, (dataitem)=> {
if(_isEmpty(filterUpdate.assetClass) && _isEmpty(filterUpdate.vehicleType)) {
return dataitem
}
if(_some(_map(filterUpdate.assetClass, 'name'), dataitem.assetClass) || _some(_map(filterUpdate.vehicleType, 'name'), dataitem.vehicleType)){
return dataitem
}
});
我們想要返回一個過濾后的數組,如下所示:
filterData = {
2020: [],
2021: [{assetClass: 'thumbnail', vehicleType: 'Toyota' }]
2022: [{assetClass: 'thumbnail', vehicleType: 'Toyota' }, {assetClass: 'photo', vehicleType: 'Prius' }, {assetClass: 'Abs', vehicleType: 'nissan' } ]
}
我遇到的問題是dataitem.assetClass
和dataitem.vehicleType
是年鍵中的對象數組。 我不知道在哪里可以在 dataitem 上使用 _map,這將幫助我返回要過濾的數組中的項目
我也願意接受非 lodash 的建議! 常規的js方法也將不勝感激!
這最終起作用了:
const filterUpdate = {
assetClass: [
{ id: 1, name: "photo" },
{ id: 2, name: "thumbnail" }
],
vehicleType: [{ id: 1, name: "nissan" }]
};
const filteredOwnership = {
2020: [],
2021: [
{ assetClass: "thumbnail", vehicleType: "Toyota" },
{ assetClass: "Abs", vehicleType: "Prius" }
],
2022: [
{ assetClass: "thumbnail", vehicleType: "Toyota" },
{ assetClass: "photo", vehicleType: "Prius" },
{ assetClass: "Abs", vehicleType: "nissan" },
{ assetClass: "LMO", vehicleType: "Tesla" }
]
};
const filters = normalizeFilters(filterUpdate);
const byYear = filterBy(filteredOwnership, filters);
function normalizeFilters(filterObj) {
let filters = {};
Object.keys(filterObj).forEach((key) => {
filters[key] = filterObj[key].map((it) => it.name);
});
return filters;
}
function filterBy(ownershipInYear, filters) {
const filteredByYear = {};
for (const year of Object.keys(ownershipInYear)) {
const ownership = filteredOwnership[year];
const inYear = [];
for (const key in filters) {
const filtered = ownership.filter((it) => filters[key].includes(it[key]));
inYear.push(filtered);
}
filteredByYear[year] = inYear.flat();
}
return filteredByYear;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.