JavaScript - фильтр объекта на основе нескольких значений - PullRequest
0 голосов
/ 02 октября 2018

Мне нужно отфильтровать некоторые данные на основе нескольких значений.Language, title и slug

[
{
    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"]

]

Ответы [ 2 ]

0 голосов
/ 02 октября 2018
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)
})
0 голосов
/ 02 октября 2018

Вместо микширования для циклов и функциональной цепочки вы можете просто использовать один из них:

 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
       )
     )
  );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...