Javascript 过滤空值

标签 javascript arrays

我正在过滤这个列表

[
 {
 appLearningItemId: 67
 catalogues: (2) [ {id: 1041, value: "New Catalog"},
                   {id: 1058, value: "Test"}]
 categories: (3) [{id: 1, value: "Soft Skills"},
                  {id: 3, value: "Non-technical"},
                  {id: 5, value: "Induction"}]
 code: "CCE0013"
 suppliers: (3) [{id: 1, value: "Company XYZ Ltd"},
                 {id: 2, value: "test c2"},
                 {id: 17, value: "new company"} ]
 title: "07 Values & Beliefs"
 type: {id: 11377, value: "Elearning"}
 }, ... * 682 items
]

使用这个对象和过滤器

const filters = {
        type: 'Elearning',
        catalog: 1041,
        category: 1,
        supplier: 1
      }
      let advancedFilteredLearningItems = this.originalLearningItems.filter(obj => obj.type.value == filters.type 
       && obj.catalogues.some( catalogs => catalogs.id == filters.catalog)
       && obj.categories.some( category => category.id == filters.category)
       && obj.suppliers.some(supplier => supplier.id === filters.supplier));
       console.log(advancedFilteredLearningItems)

效果很好。有时过滤器对象将在某些或最多 3 个值中具有空值,例如:

const filters = {
            type: 'Elearning',
            catalog: null,
            category: 1,
            supplier: null
          }

如何编辑过滤器代码以不对空项目进行过滤,这样在这种情况下我可以返回类别为 1 的所有电子学习项目?目前过滤器代码正在寻找空值,但我只想从过滤器中完全忽略它。

最佳答案

将空检查添加到您的所有过滤器是否有效?所以如果它是 null 你返回 true 因为你想要它之前的所有目录?这不是最有效的解决方案,但它应该可以让您到达所需的位置。

const filters = {
    type: 'Elearning',
    catalog: 1041,
    category: null,
    supplier: null
}
let advancedFilteredLearningItems = this.originalLearningItems.filter(obj => 
   (filters.type != null ? obj.type.value == filters.type : true)
   && obj.catalogues.some(catalogs => filters.catalog != null ? catalogs.id == filters.catalog : true)
   && obj.categories.some(category => filters.category != null ? category.id == filters.category : true)
   && obj.suppliers.some(supplier => filters.supplier != null ? supplier.id === filters.supplier : true));
console.log(advancedFilteredLearningItems)

编辑: 如果没有过滤器,更有效的解决方案是不要循环访问目录。这可以通过添加一个额外的函数来完成

let advancedFilteredLearningItems = this.originalLearningItems.filter(obj => 
   (filters.type != null ? obj.type.value == filters.type : true)
   && this.filterItems(filters.catalog, obj.catalogs)
   && this.filterItems(filters.categories, obj.categories)
   && this.filterItems(filters.supplier , obj.suppliers)
console.log(advancedFilteredLearningItems)

// new function
filterItems(filter, array) {
    if (filter == null) {
        return true;
    }
    return array.some(item => item.id == filter);
}

编辑 2:如果您不想添加新功能,这应该和我的第一次编辑一样高效

let advancedFilteredLearningItems = this.originalLearningItems.filter(obj => 
      (filters.type       == null || obj.type.value == filters.type)
   && (filters.catalog    == null || obj.catalogues.some(catalogs => catalogs.id == filters.catalog))
   && (filters.categories == null || obj.categories.some(category => category.id == filters.category))
   && (filters.supplier   == null || obj.suppliers.some(supplier => supplier.id == filters.supplier))
);

关于Javascript 过滤空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66459112/

相关文章:

javascript - 设置 xAxis 最小值和最大值时,Highstock 数据不显示

java - 将数组值从一个类复制到另一个类

javascript - 删除数组中的重复对象

javascript - 替换多个元素中一个字符的所有实例

javascript - jquery ajax获取特殊字符(元音变音)

javascript - 如何通过属性使 Javascript 数组唯一

javascript - 将重复项组织到有序的单个数组中

java - 读取文件并将数据存储在数组中,然后找到最小的十进制值

javascript - 车轮事件 PreventDefault 不取消车轮事件

javascript - 错误: $injector:unpr Unknown Provider in angularjs with gulp-uglify