繁体   English   中英

根据 2 个值过滤嵌套的 object

[英]Filtering a nested object based on 2 values

所以我想创建一个过滤器,根据链接返回数据,如果链接包含 /rome/,它将列出所有包含 /rome/ 的页面,我已经做到了。 但我也试图创建一个基于城市内市场的过滤器,例如,如果链接包含 /rome/supermarket/ 我想过滤掉页面以仅返回包含城市和市场含义 id 的页面上一个链接示例中的 1 和 2。

首先,我想我需要遍历所有页面,在我的示例中是 3 页,然后再次遍历每个城市以检查它是否包含该城市和超市,并基于此返回过滤后的数据。 我已经尝试了几件事,但我在这里挠头。

 pages: [
    {
      id: 1,
      name: 'Meals',
      startDate: '2022-11-09 10:32:00',
      endDate: '2022-11-16 10:32:00',
      cities: {
        rome: ['supermarket'],
      },
    },
    {
      id: 2,
      name: 'Deals',
      startDate: '2022-11-24 11:01:00',
      endDate: '2022-12-01 11:01:00',
      cities: {
        napoli: ['supermarket', 'minimarket'],
        rome: ['supermarket'],
      },
    },
    {
      id: 3,
      name: 'Toys',
      startDate: '2022-11-24 11:01:00',
      endDate: '2022-12-01 11:01:00',
      cities: {
        rome: ['minimarket'],
        venice: ['supermarket', 'minimarket'],
      },
    }
]

城市过滤器 ->

      const pagesFilterCity = pages.filter((item) => {
        return item.cities.hasOwnProperty(city); // where city is 'rome'
      });

我试过的->

      const pagesFilterMarket = pages.filter((item) => {
        return Object.values(item.cities)
          .flat()
          .some((item) => item === market); // where market is 'supermarket'
      });

但这只会循环遍历每个城市的第一个实例,即 3 次

想要的结果:在链接中包含 /rome/supermarket 之后,我想创建一个过滤器,该过滤器应该从上面的页面示例中返回以下数据 ->请注意,从我已经完成的链接中提取数据,这不是我的问题

 pages: [
    {
      id: 1,
      name: 'Meals',
      startDate: '2022-11-09 10:32:00',
      endDate: '2022-11-16 10:32:00',
      cities: {
        rome: ['supermarket'],
      },
    },
    {
      id: 2,
      name: 'Deals',
      startDate: '2022-11-24 11:01:00',
      endDate: '2022-12-01 11:01:00',
      cities: {
        napoli: ['supermarket', 'minimarket'],
        rome: ['supermarket'],
      },
    }
] // wanted result

据我了解,您正在检查两件事:

  1. cities object是否包含需要的城市
  2. 城市有没有特定的市场

这可以通过类似的东西来实现:

 const pages = [{ id: 1, name: 'Meals', startDate: '2022-11-09 10:32:00', endDate: '2022-11-16 10:32:00', cities: { rome: ['supermarket'], }, }, { id: 2, name: 'Deals', startDate: '2022-11-24 11:01:00', endDate: '2022-12-01 11:01:00', cities: { napoli: ['supermarket', 'minimarket'], rome: ['supermarket'], }, }, { id: 3, name: 'Toys', startDate: '2022-11-24 11:01:00', endDate: '2022-12-01 11:01:00', cities: { rome: ['minimarket'], venice: ['supermarket', 'minimarket'], }, }, ]; const search = (location, market) => { return pages.filter((record) => // Check if the cities property has a value record.cities[location] && // Check if the specific city has the given market record.cities[location].some((type) => type === market) ); }; console.log(search('rome', 'supermarket'));

如果你想做额外的检查并为了安全起见,你也可以包括

return pages.filter((record) => 
    record.cities[location] && 
    record.cities[location].length &&
    record.cities[location].some((type) => type === market)
);

您可以使用 / 将字符串一分为二以获得城市和服务。 然后你只需检查服务是否为空或者城市数组是否包含请求的服务。

 const pages = [{ id: 1, name: 'Meals', startDate: '2022-11-09 10:32:00', endDate: '2022-11-16 10:32:00', cities: { rome: ['supermarket'], }, }, { id: 2, name: 'Deals', startDate: '2022-11-24 11:01:00', endDate: '2022-12-01 11:01:00', cities: { napoli: ['supermarket', 'minimarket'], rome: ['supermarket'], }, }, { id: 3, name: 'Toys', startDate: '2022-11-24 11:01:00', endDate: '2022-12-01 11:01:00', cities: { rome: ['minimarket'], venice: ['supermarket', 'minimarket'], }, } ] function filter(search) { const [city, service] = search.split('/'); return pagesFilterCity = pages.filter((item) => { return item.cities.hasOwnProperty(city) && (service === '' || item.cities[city].includes(service)); // where city is rome for example }); } console.log(filter('rome/supermarket'))

您可以将Array.prototype.filter()可选链接 (?.)Array.prototype.includes( ) 结合使用:

代码:

 const pages = [{id: 1,name: 'Meals',startDate: '2022-11-09 10:32:00',endDate: '2022-11-16 10:32:00',cities: {rome: ['supermarket'],},},{id: 2,name: 'Deals',startDate: '2022-11-24 11:01:00',endDate: '2022-12-01 11:01:00',cities: {napoli: ['supermarket', 'minimarket'],rome: ['supermarket'],},},{id: 3,name: 'Toys',startDate: '2022-11-24 11:01:00',endDate: '2022-12-01 11:01:00',cities: {rome: ['minimarket'],venice: ['supermarket', 'minimarket']}}] const result = pages.filter(o => o.cities['rome']?.includes('supermarket')) console.log(result)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM