lodash: фильтрация объекта в объекте с помощью pickBy - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь использовать "lodash": "^4.17.10" для фильтрации объекта.

См. Ниже мой минимальный жизнеспособный пример:

const obj = {
    "2": {
        "title": "GeForce GTX 1070 SC GAMING ACX 3.0 Black Edition",
        "category": [{
            "term_id": 34,
            "name": "Graphic Card",
            "slug": "graphic-card",
            "term_group": 0,
        }],
        "currency": "$",
        "price": "547.85",
        "watt": "0",
    },
    "3": {
        "title": "GeForce White Edition",
        "category": [{
            "term_id": 32,
            "name": "other-card",
            "slug": "other-card",
            "term_group": 0,
        }],
        "currency": "$",
        "price": "600.85",
        "watt": "0",
    }
}

let allGpuParts = _.pickBy(obj, (value, key) => {
    return _.startsWith(key.category, "graphic-card")
})

console.log("allGpuParts")
console.log(allGpuParts)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

Как вы можете в настоящее время, результат не возвращается.Я хотел бы получить обратно только объект "2":, который имеет слаг "slug": "graphic-card".

Любые предложения, как фильтровать с помощью lodash?

Я ценю ваши ответы!

Ответы [ 2 ]

0 голосов
/ 31 мая 2018
  • категория является массивом объектов , поэтому вам нужно каким-то образом повторить его, например, используя Array.prototype.some чтобы выяснить, есть ли какой-либо предмет, удовлетворяющий условию
  • . Вам нужно проверить саму slug , а не проверять категорию string-vs-object

Я сохранил StartSith тест, хотя ваш текущий пример также будет работать с точным соответствием

const graphicCategory = cat => cat.slug.startsWith('graphic-card'); // true or false test

_.pickBy(
    obj, // your object
    value => value.category.some(graphicCategory) // pick if some category has graphic-card
); // {2: { ... }}
0 голосов
/ 31 мая 2018

Вы можете просто использовать _.filter и _.isMatch, чтобы найти искомую пару ключ-значение _.some просто означает, что при любом совпадении return true.

const obj = {
    "2": {
        "title": "GeForce GTX 1070 SC GAMING ACX 3.0 Black Edition",
        "category": [{
            "term_id": 34,
            "name": "Graphic Card",
            "slug": "graphic-card",
            "term_group": 0,
        }],
        "currency": "$",
        "price": "547.85",
        "watt": "0",
    },
    "3": {
        "title": "GeForce White Edition",
        "category": [{
            "term_id": 32,
            "name": "other-card",
            "slug": "other-card",
            "term_group": 0,
        }],
        "currency": "$",
        "price": "600.85",
        "watt": "0",
    }
}

const isGPU = o => _.isMatch(o, {slug: "graphic-card"});
const allGpuParts = _.filter(obj, ({category}) => category.some(isGPU));

console.log("allGpuParts")
console.log(allGpuParts)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

Пожалуйста, дайте мне знать, если я неправильно понял или у вас есть какие-либо вопросы.

...