Javascript 筛选数组并至少匹配一个条件

Javascript 筛选数组并至少匹配一个条件,javascript,arrays,vue.js,vuejs2,lodash,Javascript,Arrays,Vue.js,Vuejs2,Lodash,我想解决以下问题:我想使用Vue.js和lodash(或纯JavaScript)按特定条件过滤数组 我的物品 我得到了一个项目的列表。每个项目都包含(可选)类别 对象汽车可以有一个类别 对象数组项 对象Car 我的目标 我只想显示那些项,这些项至少通过了这些规则中的一条规则: 项目至少有一个类别与汽车的类别相匹配 项设置了否类别 我的方法 我正在使用计算的值筛选此项。项: computed: { filteredItems: function () {

我想解决以下问题:我想使用Vue.js和lodash(或纯JavaScript)按特定条件过滤数组

我的物品
  • 我得到了一个
    项目的列表
    。每个项目都包含(可选)
    类别
  • 对象
    汽车
    可以有一个
    类别
对象数组
对象
Car
我的目标 我只想显示那些
,这些项至少通过了这些规则中的一条规则:

  • 项目
    至少有一个
    类别
    汽车的
    类别
    相匹配
  • 设置了
    类别
我的方法 我正在使用
计算的
值筛选
此项。项

computed: {
        filteredItems: function () {
            let vm = this;
            return _.filter (this.items, function (item) {
                return _.includes (item.categories, vm.car.category );
            });
        }
    },
当前结果:
filteredItems
始终为空

您需要对
类别执行一个更高级别的检查,因为您需要针对其中的每个项目进行测试。使用常规javascript,如果任何项匹配,您都可以使用它返回true

let data=[{“id”:1,“title”:“Item 1”,“categories”:[{“id”:4,“title”:“category 4”,“description”:“,”,“,”,”,“,”,”,{“id”:5,“title”:“category 5”,“description”:“,”,“,”,“,”,“,”,“,”,“,”,“,”,,“,”,“,”,“,”,“,”,“,”,“,“,”,“,”,“,“,”
let car={“category”:{“id”:5,“title”:“category 5”,“description”:“}”,title:“Test”}
let filtered=data.filter(item=>!item.categories | | | | item.categories.length==0 | | | item.categories.some(cat=>cat.id==car.categories.id))

console.log(已过滤)
您需要在
类别
上多做一级检查,因为您需要针对其中的每个项目进行测试。使用常规javascript,如果任何项匹配,您都可以使用它返回true

let data=[{“id”:1,“title”:“Item 1”,“categories”:[{“id”:4,“title”:“category 4”,“description”:“,”,“,”,”,“,”,”,{“id”:5,“title”:“category 5”,“description”:“,”,“,”,“,”,“,”,“,”,“,”,“,”,,“,”,“,”,“,”,“,”,“,”,“,“,”,“,”,“,“,”
let car={“category”:{“id”:5,“title”:“category 5”,“description”:“}”,title:“Test”}
let filtered=data.filter(item=>!item.categories | | | | item.categories.length==0 | | | item.categories.some(cat=>cat.id==car.categories.id))

console.log(过滤)
使用
lodash
您需要

result = _.filter(data, ({categories}) =>
    _.isEmpty(categories) ||
    _.some(categories, cat => cat.id === car.category.id))
如果您想比较整个类别对象,而不仅仅是ID,那么

_.filter(data, ({categories}) => 
    _.isEmpty(categories) || 
    _.some(categories, cat => _.isEqual(cat, car.category)
    ))

使用
lodash
您需要

result = _.filter(data, ({categories}) =>
    _.isEmpty(categories) ||
    _.some(categories, cat => cat.id === car.category.id))
如果您想比较整个类别对象,而不仅仅是ID,那么

_.filter(data, ({categories}) => 
    _.isEmpty(categories) || 
    _.some(categories, cat => _.isEqual(cat, car.category)
    ))

您可以仅使用ID进行比较,假设每个类别都是唯一的。函数的返回值类似于
return!item.categories.length | | |包括(item.categories.map(category=>category.id)、vm.car.category.id)您可以仅使用ID进行比较,假设每个类别都是唯一的。函数的返回值类似于
return!item.categories.length | | |包括(item.categories.map(category=>category.id)、vm.car.category.id)非常感谢。是否有一种优雅的方法来检查是否设置了
car.category
?我会将它包装成一个
if
检查,如下所示:
if(typeof vm.car.category!='undefined'){…}
@SPQRInc:在第二个代码片段中,
isEqual
会处理这个问题。不用查了,非常感谢。是否有一种优雅的方法来检查是否设置了
car.category
?我会将它包装成一个
if
检查,如下所示:
if(typeof vm.car.category!='undefined'){…}
@SPQRInc:在第二个代码片段中,
isEqual
会处理这个问题。不需要检查。