Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 多重数据过滤_Javascript_Reactjs_Filter - Fatal编程技术网

Javascript 多重数据过滤

Javascript 多重数据过滤,javascript,reactjs,filter,Javascript,Reactjs,Filter,请帮助我进行正确的多重筛选,应该可以按城市、标签和距离进行筛选,每个类别都有许多项,例如: 城市:莫斯科、圣彼得堡、基辅、华沙、伦敦 标签:马拉松、半程马拉松、接力赛 距离:7公里、22公里、100公里、42公里 您可以标记任意数量的项目以进行筛选 var事件=[ {id:0,日期:2019年12月22日,名称:event1,城市:莫斯科,距离:100公里,标签:[{id:0,名称:马拉松},{id:1,名称:半程马拉松}]}, {id:1,日期:2019年12月22日,名称:event2,城

请帮助我进行正确的多重筛选,应该可以按城市、标签和距离进行筛选,每个类别都有许多项,例如:

城市:莫斯科、圣彼得堡、基辅、华沙、伦敦

标签:马拉松、半程马拉松、接力赛

距离:7公里、22公里、100公里、42公里

您可以标记任意数量的项目以进行筛选

var事件=[ {id:0,日期:2019年12月22日,名称:event1,城市:莫斯科,距离:100公里,标签:[{id:0,名称:马拉松},{id:1,名称:半程马拉松}]}, {id:1,日期:2019年12月22日,名称:event2,城市:伦敦,距离:22公里,标签:[{id:0,名称:Relay}]}, {id:2,日期:2019年12月22日,名称:event3,城市:莫斯科,距离:42公里,标签:[{id:0,名称:Marathon},{id:1,名称:Relay}]}, {id:3,日期:2019年12月22日,名称:event4,城市:基辅,距离:100公里,标签:[{id:0,名称:马拉松},{id:1,名称:半程马拉松},{id:2,名称:БСафаа]}, {id:4,日期:2019年12月22日,名称:event5,城市:华沙,距离:42公里,标签:[{id:0,名称:Marathon}]}, {id:5,日期:2019年12月22日,姓名:event6,城市:圣彼得堡,距离:22公里,标签:[{id:0,姓名:Relay},{id:1,姓名:半程马拉松}]}, {id:6,日期:2019年12月22日,名称:event7,城市:圣彼得堡,距离:7公里,标签:[{id:0,名称:半程马拉松}]},
] 也许可以这样做,将过滤器作为一个具有单个键/值对的对象数组传递。然后,您可以单独筛选这些事件,并在至少有一个筛选器匹配时返回该事件

这应该允许您对多个过滤器类别以及这些类别中的多个值进行过滤

const filters = [{ city: 'Moscow' }, { city: 'Kiev' }, { distances: '42km'} ];

events.filter(event => {

    // will return true if one of the filtered values is present in the event object
    return filters.some(filter => {
        return hasFilteredProperty(event, filter);
    });

});

// Pass filter as { key: value }
const hasFilteredProperty = (event, filterObj) => {

    const filterKey = Object.keys(filterObj)[0];

    if (filterKey === 'tags') {
        return hasFilteredTags(event, filterObj[filterKey]);
    } else {
        return event[filterKey] === filterObj[filterKey];
    }

}

// Pass filtered tags as an array of names: [ 'Half Marathon', 'Marathon', '100km' ]
const hasFilteredTags = (event, filteredTags) => {

    const eventTagNames = event.tags.map(tag => tag.name);
    return eventTagNames.some(tagName => filteredTags.includes(tagName));

}
您可以使用array includes函数检查filterCity中是否存在事件所在城市。对于其他类似的属性,您也可以这样做。对于标记,由于事件属性本身是一个对象数组,您可以首先使用map创建标记名数组,然后检查filterTag中是否至少存在一个元素。演示代码如下所示

let filterCity = ['Moscow', 'Russia']
let filterTag = ['Relay','Marathon']
let filteredEvent = events.filter(event => {
  if(filterCity.length && !filterCity.includes(event.city)) return false
   if(filterTag.length && event.tags.map(tag => tag.name).find(tag => filterTag.indexOf(tag)>-1)==undefined) return false
 return true
})

console.log(filteredEvent)

好的,对于一个简单的对象,它可以工作,但是标签字段呢,在那里有一个对象数组?他们也必须通过过滤器,但是这个选项不会过滤他们。我已经更新了我的答案,以包括一个例子,但这实际上取决于你的过滤器的数据结构,我目前还不清楚。显然,这个例子没有考虑到案例不敏感等问题,但它应该让你知道如何继续。现在它可以使用标签,但问题是,例如,如果我们选择城市“莫斯科”作为过滤器,过滤器“半程马拉松”,它将显示至少遇到一件事情的所有事件,但是过滤器的想法是选择莫斯科市,过滤器半程马拉松应该只在所有过滤器匹配的地方输出。。这在您最初的问题中并不清楚,但在这种情况下,您需要修改匹配函数以执行不同的操作。目前,这些函数的工作方式确实与至少一个匹配。如果你想匹配你应该能够使用的所有东西,我用evry替换了所有的SOM,它不工作,甚至坏了,它只检查一个键,例如city,如果还有标签,我甚至不看这个键,我在控制台中检查它如果filterCity为空,filterTag=['Half Marathon','Marathon']然后它会找到所有有半程马拉松或马拉松标记的事件,并且只有那些有半程马拉松和马拉松标记的事件才应该被找到,否则一切都很好,但有标记就不太正确