Фильтровать сложный массив с несколькими критериями - PullRequest
0 голосов
/ 11 июля 2019
var sd = {
"searchData": [
    {
        "description": "ISU ISU",
        "tags": {
            "portfolio": [
                "p1",
                "p2",
                "p3"
            ],
            "industry": [
                "i1",
                "i2",
                "i3"
            ]
        },

    },
    {
        "description": null,
        "tags": {
            "portfolio": [
                "p1",
                "p2",
                "p3"
            ],
            "industry": [
                "i1",
                "i4",
                "i5"
            ]
        },
        {
        "description": null,
        "tags": {
            "portfolio": [
                "p4",
                "p5",
                "p6"
            ],
            "industry": [
                "i1",
                "i2",
                "i3"
            ]
        },
    }
]

}

Я получу эти данные из API. Я хочу отфильтровать вышеприведенное значение портфеля p1, а отрасль - i1.

Я пытался использовать фильтр, но не смог получить требуемый результат. Я не могу использовать другие библиотеки, такие как loadash или undersore. Я должен сделать это из обычных методов ES6.

Ответы [ 4 ]

1 голос
/ 11 июля 2019

Вы можете взять массив с критериями поиска и отфильтровать массив, взяв ключ и значение для проверки.

var data = { searchData: [{ description: "ISU ISU", tags: { portfolio: ["p1", "p2", "p3"], industry: ["i1", "i2", "i3"] } }, { description: null, tags: { portfolio: ["p1", "p2", "p3"], industry: ["i1", "i4", "i5"] } }, { description: null, tags: { portfolio: ["p4", "p5", "p6"], industry: ["i1", "i2", "i3"] } }] },
    search = [["portfolio", "p1"], ["industry", "i1"]],
    result = data.searchData.filter(({ tags }) => search.every(([k, v]) => tags[k].includes(v)));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1 голос
/ 11 июля 2019

Вы можете использовать метод фильтра. Не уверен, как ты это использовал, но так оно и должно выглядеть.

sd.searchData.filter(obj => {
    if (!obj.tags.industry.includes("i1"))
        return false;
    if (!obj.tags.portfolio.includes("p1"))
        return false;
    return true;
})

Или один вкладыш:

sd.searchData.filter(obj => obj.tags.industry.includes("i1") && obj.tags.portfolio.includes("p1"));
0 голосов
/ 11 июля 2019

Вы можете сделать:

const sd = {searchData : [{"description": "ISU ISU","tags": {"portfolio": ["p1","p2","p3"],"industry": ["i1","i2","i3"]},},{"description": null,"tags": {"portfolio": ["p1","p2","p3"],"industry": ["i1","i4","i5"]},},{"description": null,"tags": {"portfolio": ["p4","p5","p6"],"industry": ["i1","i2","i3"]},}]};
const result = sd.searchData.filter(({tags}) => tags.industry.includes('i1') && tags.portfolio.includes('p1'));

console.log(result);
0 голосов
/ 11 июля 2019

let sd = {
    searchData : [
        {
            "description": "ISU ISU",
            "tags": {
                "portfolio": [
                    "p1",
                    "p2",
                    "p3"
                ],
                "industry": [
                    "i1",
                    "i2",
                    "i3"
                ]
            },

        },
        {
            "description": null,
            "tags": {
                "portfolio": [
                    "p1",
                    "p2",
                    "p3"
                ],
                "industry": [
                    "i1",
                    "i4",
                    "i5"
                ]
            },
        },
        {
            "description": null,
            "tags": {
                "portfolio": [
                    "p4",
                    "p5",
                    "p6"
                 ],
                "industry": [
                    "i1",
                    "i2",
                    "i3"
                ]
            },
        }
    ]
    };

console.log(sd.searchData.filter((element) => {
    return element.tags.portfolio.includes('p1') && element.tags.industry.includes('i1')
}));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...