簡體   English   中英

使用 Lodash 鏈接,如何在映射到 arrays 的 object 時返回過濾的對象數組

[英]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.assetClassdataitem.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM