Оператор if в выборе JSON?

В приведенном ниже JSON я пытаюсь выбрать необработанное значение цены, когда цена is_rpp = True. Иногда это может быть первая цена или любая из N перечисленных цен, но в большинстве случаев ее нет или ОДНА is_rpp = истинная цена.

Это возможно?

Например, использование {{ $json["price"]["value"] }} действительно выбирает цену для меня, но я хочу, чтобы is_rpp = True price.

Спасибо

{
    "position": 1,
    "title": "Apple USB-C to Lightning Cable (2 m)",
    "asin": "asintest",
    "link": "https://www.amazon.com/",
    "categories": [{
        "name": "Electronics",
        "id": "electronics"
    }],
    "image": "https://m.media-amazon.com/images/",
    "is_prime": true,
    "rating": 4.8,
    "ratings_total": 15213956,
    "prices": [{
            "symbol": "$",
            "value": 29,
            "currency": "USD",
            "raw": "$29.00",
            "name": "$29.00",
            "is_primary": true
        },
        {
            "symbol": "$",
            "value": 35,
            "currency": "USD",
            "raw": "$35.00",
            "name": "$29.00",
            "is_rrp": true
        }
    ],
    "price": {
        "symbol": "$",
        "value": 29,
        "currency": "USD",
        "raw": "$29.00",
        "name": "$29.00",
        "is_primary": true
    },
    "page": "1",
    "position_overall": 1
}

Это будет использоваться в N8N: https://docs.n8n.io/code-examples/expressions/jmespath/#an-alternative-to-arrow-functions

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
0
177
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вот что вы можете сделать, используя функцию Array.prototype.find:

Если он возвращает undefined, это означает, что внутри массива is_rpp = true нет элементов с условием prices.

$json.prices?.find(p => p.is_rrp)?.value

const $json = {
    "position": 1,
    "title": "Apple USB-C to Lightning Cable (2 m)",
    "asin": "asintest",
    "link": "https://www.amazon.com/",
    "categories": [{
        "name": "Electronics",
        "id": "electronics"
    }],
    "image": "https://m.media-amazon.com/images/",
    "is_prime": true,
    "rating": 4.8,
    "ratings_total": 15213956,
    "prices": [{
            "symbol": "$",
            "value": 29,
            "currency": "USD",
            "raw": "$29.00",
            "name": "$29.00",
            "is_primary": true
        },
        {
            "symbol": "$",
            "value": 35,
            "currency": "USD",
            "raw": "$35.00",
            "name": "$29.00",
            "is_rrp": true
        }
    ],
    "price": {
        "symbol": "$",
        "value": 29,
        "currency": "USD",
        "raw": "$29.00",
        "name": "$29.00",
        "is_primary": true
    },
    "page": "1",
    "position_overall": 1
};

const rrpPrice = $json.prices?.find(p => p.is_rrp)?.value;

console.info(rrpPrice);  // 35

хм, по какой-то причине это не работает, но это может быть ограничение N8N: docs.n8n.io/code-examples/expressions/jmespath/…

AAA 05.06.2023 12:50

Судя по документу, синтаксис должен быть {{ $jmespath($json.prices, "[?is_rrp==true].value") }}

Hao Wu 05.06.2023 14:32

это так близко, нет синтаксической ошибки, но возвращается только предыдущее значение... то есть: в этом случае он возвращает 29 вместо 35...

AAA 07.06.2023 04:53
{{ $json.prices[?(@.is_rrp == true)].raw }}

Это даст вам необработанное значение цены, когда is_rrp имеет значение true в массиве цен.

Обратите внимание, что выражения JSONPath могут различаться в зависимости от конкретной реализации.

Я думаю, вы на что-то наткнулись с ограничением на конкретную реализацию... код не работает (он говорит о недопустимом синтаксисе). вот больше информации об ограничениях: хм, по какой-то причине это не работает, но это может быть ограничение N8N: docs.n8n.io/code-examples/expressions/jmespath/…

AAA 05.06.2023 12:50
Ответ принят как подходящий

Понятно!

{{ $jmespath($json.prices, "[?is_rrp == `true`] | [0].value") }}

Другие вопросы по теме