如果array.find返回未定义,则ES6 / JS分配默认值

时间:2019-03-26 19:42:29

标签: javascript ecmascript-6

如果array.find返回“未定义”,如何为变量设置默认值。

这是导致我出现问题的那条线。在某些情况下,此变量将填充,而在其他情况下,则不会填充,在这种情况下,我希望将其默认设置为0。

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

4 个答案:

答案 0 :(得分:3)

代码存在的问题是,在.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 :(得分:1)

另一种方法是使用闭包和具有默认对象/值的分解。

const
    getAmount = ({ amount = 0 } = {}) => amount,
    credit = getAmount(response.data.find(t => t.paymentType == 'RF' && t.status == 1));

答案 2 :(得分:1)

可能会产生过大杀伤力,但是您可以创建并实现可重用的null传播方法。

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);

这最初是由tocqueville作为this answer的一部分编写的。

答案 3 :(得分:1)

我看到这个问题已经得到回答,但是我认为这可以有所帮助

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);

Reducer在遍历整个数组时会使用更多的时钟周期,而Array.prototype.find一旦到达第一个匹配项就会停止。这也可能导致结果也有所不同,因为reducer的编写方式将从匹配数组中获取 last 项。