繁体   English   中英

在 React Native 中过滤以查找两个 arrays 的交集

[英]Filters to find intersection of two arrays in React Native

我想过滤一组对象。 数组是运动类的列表,对象是类。

它看起来像这样:

const list = [{category: "yoga", level: "beginner", duration: "15 minutes"}] 

我必须应用过滤器,以便用户可以在类别(瑜伽、普拉提……)级别(初学者、高级……)之间进行选择。

我需要找到过滤器的交集,这意味着如果选择了“瑜伽”和“初学者”,我只想返回初学者瑜伽课程。

用户可以将变量 beginnnerFilter 等设置为真/假。变量有氧/瑜伽等。所以如果瑜伽过滤器为真,yogaFilter = "yoga"。 如果为假,yogaFilter = ""

例子:

function filterIntersect() {
  let filteredListCategory = [];
  let filteredListLevel = [];

  
  for(let i = 0; i < list.length; i++) {
    if (list[i].category.toLowerCase() === cardio) {
       filteredListCategory.push(list[i])
   } else if (list[i].category.toLowerCase() === yoga) {
       filteredListCategory.push(list[i])
   } else if (list[i].category.toLowerCase() === boxing) {
       filteredListCategory.push(list[i])
   } else if (list[i].category.toLowerCase() === dance) {
       filteredListCategory.push(list[i])
   } else if (list[i].category.toLowerCase() === pilates) {
       filteredListCategory.push(list[i])
   } else if (list[i].category.toLowerCase() === stretching) {
       filteredListCategory.push(list[i])
   } 
  }

  if (allFilterCategory === true) {
       filteredListCategory = [...list];
   }

  for(let k = 0; k < list.length; k++) {
    if (list[k].level.toLowerCase() === beginnerFilter) {
       filteredListLevel.push(list[k])
   } else if (list[k].level.toLowerCase() === intermediateFilter) {
       filteredListLevel.push(list[k])
   } else if (list[k].level.toLowerCase() === advancedFilter) {
       filteredListLevel.push(list[k])
   }
  } 

  if (allFilterLevel === true) {
       filteredListLevel = [...list];
   }

let finalList = filteredListCategory.filter(item=> filteredListLevel.includes(item));

return finalList.length === 0 ? list : finalList;
}

我设法返回一个过滤后的数组,但它没有按预期工作。 有时过滤器不适用,我有完整列表而不是过滤列表。 我不确定 for 循环在这里是否合适? 我也尝试使用 new Set 但也没有工作。 非常感谢。

您可以使用 arrays 的.filter.some方法来代替if语句和for循环。 例如

 const categoryChoices = [ { category: "yoga", checked: false }, { category: "meditation", checked: true }, { category: "pilates", checked: false }, { category: "cardio", checked: true }, ]; const levelsChoices = [ { level: "beginner", checked: true }, { level: "intermediate", checked: true }, { level: "advanced", checked: false }, ]; const data = [ { category: "yoga", level: "beginner", duration: '30 minutes' }, { category: "yoga", level: "intermediate", duration: '60 minutes' }, { category: "yoga", level: "advanced", duration: '90 minutes' }, { category: "meditation", level: "beginner", duration: '30 minutes' }, { category: "meditation", level: "intermediate", duration: '60 minutes' }, { category: "meditation", level: "advanced", duration: '90 minutes' }, { category: "pilates", level: "beginner", duration: '30 minutes' }, { category: "pilates", level: "intermediate", duration: '60 minutes' }, { category: "pilates", level: "advanced", duration: '90 minutes' }, { category: "cardio", level: "beginner", duration: '30 minutes' }, { category: "cardio", level: "intermediate", duration: '60 minutes' }, { category: "cardio", level: "advanced", duration: '90 minutes' }, ]; const checkedCategories = categoryChoices.filter((c) => c.checked).map((c) => c.category); const checkedLevels = levelsChoices.filter((l) => l.checked).map((l) => l.level); const filteredData = data.filter( ({ category, level }) => checkedCategories.some((c) => c === category) && checkedLevels.some((l) => l === level) ); console.log(filteredData);

暂无
暂无

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

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