首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于2个值过滤嵌套对象

基于2个值过滤嵌套对象
EN

Stack Overflow用户
提问于 2022-11-28 15:09:27
回答 3查看 43关注 0票数 0

因此,如果链接包含/罗马/它将列出所有包含/罗马/我设法做到的页面,我想创建一个基于链接返回数据的筛选器。但是我也试图创建一个基于城市市场的过滤器,例如,如果链接包含/罗马/超市/我想过滤掉页面,只返回包含城市和市场的页面,在我的最后一个链接示例中,这意味着id 1和2。

首先,我认为我需要遍历所有的页面,在我的例子中是3,然后再循环一次,让每个城市检查它是否包含那个城市和超市,并根据它返回过滤后的数据。我试过几样东西,但我在这里挠头。

代码语言:javascript
复制
 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'],
      },
    }
]

城市->的过滤器

代码语言:javascript
复制
      const pagesFilterCity = pages.filter((item) => {
        return item.cities.hasOwnProperty(city); // where city is 'rome'
      });

我试过的->

代码语言:javascript
复制
      const pagesFilterMarket = pages.filter((item) => {
        return Object.values(item.cities)
          .flat()
          .some((item) => item === market); // where market is 'supermarket'
      });

但是这只会从每个城市循环第一个实例,这意味着3次。

想要的结果:在链接中有/罗马/超市之后,我想创建一个过滤器,它应该从上面的-> 页面中返回以下数据--注意,从我已经做过的链接中提取数据,这不是我的问题

代码语言:javascript
复制
 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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-11-28 16:13:33

据我所知,你正在检查两件事:

  1. 城市对象是否包含所需的城市?
  2. 这个城市有特定的市场吗?

这可以通过类似于以下几点来实现:

代码语言:javascript
复制
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'));

如果你想做一个额外的检查,并在安全方面,你也可以包括

代码语言:javascript
复制
return pages.filter((record) => 
    record.cities[location] && 
    record.cities[location].length &&
    record.cities[location].some((type) => type === market)
);
票数 1
EN

Stack Overflow用户

发布于 2022-11-28 15:17:13

您可以使用/要拥有城市和服务将字符串拆分为两部分。然后,您只需检查服务是否为空或城市数组是否包含所请求的服务。

代码语言:javascript
复制
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'))

票数 0
EN

Stack Overflow用户

发布于 2022-11-28 16:53:35

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

代码:

代码语言:javascript
复制
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)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74602618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档