【问题标题】:JavaScript - Filter object based on multiple valuesJavaScript - 基于多个值过滤对象
【发布时间】:2018-10-02 08:03:27
【问题描述】:

我需要根据多个值过滤一些数据。 Languagetitleslug

[
{
    de: "4567uy55",
    en: "654321",
    lang: [
      {
        id: "654321",
        language: "English",
        title: "Title1"
      },
      {
        id: "4567uy55",
        language: "German",
        title: "Title2"
      }
    ],
    slug: 'some-slug'
},
...
]

我现在返回的所有对象都包含一个或部分过滤器(如果标题是 This is a title,则单词 this 应该匹配),但我需要返回包含所有这些过滤器的对象。 我使用对象 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"]

]

【问题讨论】:

  • 你能给出一个输入和你想要的输出的具体例子吗?
  • 输入是我在问题中定义的对象数组,输出是与newArray 中推送的过滤器匹配的任何对象。所以newArray 应该包含匹配所有过滤器的对象。
  • language/lang过滤不是更好吗?

标签: javascript arrays object


【解决方案1】:

您可以只使用其中之一,而不是混合使用 for 循环和功能链:

 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
       )
     )
  );

【讨论】:

    【解决方案2】:
    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)
    })
    

    【讨论】:

      猜你喜欢
      • 2020-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      • 2020-02-17
      • 2021-05-26
      相关资源
      最近更新 更多