JavaScript-基于多个值的筛选对象
我需要根据多个值过滤一些数据<代码>语言,JavaScript-基于多个值的筛选对象,javascript,arrays,object,Javascript,Arrays,Object,我需要根据多个值过滤一些数据语言,标题和slug [ { de: "4567uy55", en: "654321", lang: [ { id: "654321", language: "English", title: "Title1" }, { id: "4567uy55", language: "German", title: "Tit
标题
和slug
[
{
de: "4567uy55",
en: "654321",
lang: [
{
id: "654321",
language: "English",
title: "Title1"
},
{
id: "4567uy55",
language: "German",
title: "Title2"
}
],
slug: 'some-slug'
},
...
]
我现在返回的是所有包含一个或部分过滤器的对象(如果标题是这是一个标题
,则单词这
应该匹配),但我需要返回包含所有过滤器的对象。
我使用一个object flattner只是为了得到一个对象中的所有属性和值,但我不能让它以我需要的方式进行过滤
multiFilter = (arr, filters) => {
console.log(filters)
console.log(arr)
let newArray = []
for (let c of arr) {
let flatCourse = flatten(c)
for (let k in flatCourse) {
const keyArr = k.split('/')
const filterKeys = Object.keys(filters)
Object.keys(filters).map((key) => {
if (keyArr.includes(key)) {
const flatVal = flatCourse[k].toString().toLowerCase()
const filterVal = filters[key].toString().toLowerCase()
console.log(flatVal)
console.log(filterVal)
if (flatVal.includes(filterVal)) {
arr = []
arr.push(c)
newArray.push(c)
}
}
})
}
}
return newArray
}
过滤器如下所示:
[
language:["English"],
title: ["Some title"],
slug:["some slug"]
]
不必混合使用循环和函数链接,您只需使用其中一种:
multiFilter = (arr, filters) =>
arr.map(flatten).filter(el => // filter out elements from arr
Object.entries(filters).every(([fKey, fValues]) => // ensure that every key is included in the object
Object.entries(el).some(([oKey, oValue]) =>
oKey.split("/").includes(fKey) && fValues.includes(oValue)// make sure that at least one of the values equals the elements value
)
)
);
您能给出一个输入和所需输出的具体示例吗?输入是我在问题中定义的对象数组,输出是与推入的过滤器相匹配的任何对象
newArray
。所以newArray
应该包含匹配所有筛选器的对象。使用language/lang
进行筛选不是更好吗?
arr.filter(course => {
// Returns an array of booleans corresponding to whether or not each filter condition is satisfied
return Object.keys(filters).map(key => {
return filters[key].map(filter => {
// Special case here because lang is an array
if (key == 'language' && course.lang != undefined) {
return course.lang.some(lang => lang[key].includes(filter))
}
if (course[key] == undefined) {
return false
}
return course[key].includes(filter)
}).every(result => result == true)
}).every(result => result == true)
})