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