ES6 / JS присваивает значение по умолчанию, если array.find возвращает неопределенное значение - PullRequest
1 голос
/ 26 марта 2019

Как установить значение по умолчанию для переменной, если array.find возвращает 'undefined'.

Вот строка, которая вызывает у меня проблемы.В некоторых случаях эта переменная будет заполняться, но в других - нет, и в этом случае я хочу, чтобы по умолчанию она была равна 0.

this.statistics.creditAmount = response.data.find(t => t.paymentType == 'RF' && t.status == 1).amount || 0;

Ответы [ 4 ]

3 голосов
/ 26 марта 2019

Проблема с вашим кодом в том, что вы получаете доступ к .amount из undefined для случаев, когда array.find возвращает undefined. Вы можете решить это, добавив охрану:

const credit = response.data.find(t => 
  t.paymentType == 'RF' && t.status == 1);

this.statistics.creditAmount = credit ? credit.amount : 0;

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

Я вижу, что на это ответили, но я думал, что это может помочь

const { amount = 0 } = response.data.find(t => t.paymentType === 'RF' && t.status === 1) || {};
this.statistics.creditAmount = amount;

Или вы можете использовать редуктор:

  this.statistics.creditAmount = response.data.reduce((amt, t) => t.paymentType === 'RF' && t.status === 1 ? t.amount : amt, 0);

Редуктор будет использовать больше тактов при прохождениивесь массив, тогда как Array.prototype.find останавливается, как только достигает первого совпадения.Это также может привести к тому, что результаты будут отличаться, так как способ, которым записан редуктор, извлечет элемент last из соответствующего массива.

1 голос
/ 26 марта 2019

Возможно перерасход, но вы можете создать и реализовать многоразовый метод распространения пустых значений.

const response = {data: []};

const _try = (func, fallbackValue) => {
    try {
        var value = func();
        return (value === null || value === undefined) ? fallbackValue : value;
    } catch (e) {
        return fallbackValue;
    }
}


const result = _try(() => response.data.find(t => t.paymentType == 'RF' && t.status == 1).amount, 0);
console.log(result);

Первоначально он был написан Токвилем как часть этого ответа .

1 голос
/ 26 марта 2019

Другой подход заключается в использовании замыкания и деструктуризации с объектом / значением по умолчанию.

const
    getAmount = ({ amount = 0 } = {}) => amount,
    credit = getAmount(response.data.find(t => t.paymentType == 'RF' && t.status == 1));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...