代码之家  ›  专栏  ›  技术社区  ›  Ciprian

基于多个值的javascript过滤对象

  •  -1
  • Ciprian  · 技术社区  · 8 年前

    我需要根据多个值筛选一些数据。 Language 我是说, title 和 slug

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

    我现在拥有的返回所有拥有一个或部分过滤器的对象(如果title是 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"]
    
    ]
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   Jonas Wilms    8 年前

    而不是混合循环和功能链,你可以只与其中之一:

     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
  •  0
  •   Nico    8 年前
    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)
    })