因此,如果链接包含/罗马/它将列出所有包含/罗马/我设法做到的页面,我想创建一个基于链接返回数据的筛选器。但是我也试图创建一个基于城市市场的过滤器,例如,如果链接包含/罗马/超市/我想过滤掉页面,只返回包含城市和市场的页面,在我的最后一个链接示例中,这意味着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次。
想要的结果:在链接中有/罗马/超市之后,我想创建一个过滤器,它应该从上面的-> 页面中返回以下数据--注意,从我已经做过的链接中提取数据,这不是我的问题
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发布于 2022-11-28 16:13:33
据我所知,你正在检查两件事:
这可以通过类似于以下几点来实现:
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)
);发布于 2022-11-28 15:17:13
您可以使用/要拥有城市和服务将字符串拆分为两部分。然后,您只需检查服务是否为空或城市数组是否包含所请求的服务。
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'))
发布于 2022-11-28 16:53:35
您可以将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)
https://stackoverflow.com/questions/74602618
复制相似问题