首页 > 解决方案 > Javascript减少条件

问题描述

仅当累加器 (a) 和 currentValue (b) 都是整数时,如何使用 reduce 来返回总和?

我的 guestGroups 数组:

     "guestGroups":[  
         {  
            "bookingNumber":"21.05.201827.05.20181208",
            "arrivalDate":"2018-05-19T22:00:00.000Z",
            "departureDate":"2018-05-25T22:00:00.000Z",
            "customerId":1,
            "fields":[  
               {  
                  "value":"2",
                  "display_name":"Personen Anzahl",
                  "servicio_tags":[  
                     "person-number-info"
                  ]
               }
            ],
            "number":"041"
         }
      ]

  getPersonNumberAdult() {
    const personNumberField = this.fields.find(f => {
      return f.servicio_tags && f.servicio_tags.includes('person-number-info');
    });
    return personNumberField ? Number(personNumberField.value.match(/\d+/)[0]) : '-';
}

isInt(value) {
  let x = parseFloat(value);
  return !isNaN(value) && (x | 0) === x;
}

guestInfo: t.guestGroups
    .map(gg => gg.getPersonNumberAdult())
    .reduce((function(a, b) {
        if (a && b) {
            {
                if (this.isInt(a) && this.isInt(b)) {
                    return a + b
                } else {
                    return '-'
                }
            }
        }
    }), 0)

这给了我undefined.

感谢您的努力!

标签: javascriptfunctional-programmingreduce

解决方案


getPersonNumberAdult不应返回数字或字符串。它应该返回一个整数,或者NaN如果没有可用的数字。'-'应该只用于最后格式化输出。

一旦你得到了,你可以过滤掉无效值并对其余的求和:

const sum = t.guestGroups
.map(gg => gg.getPersonNumberAdult())
.filter(v => isInt(v)) // or just !isNaN
.reduce((a, b) => a + b, 0);

或者只是将它们相加,然后如果任何值无效则替换NaN为:'-'

const sum = t.guestGroups
.map(gg => gg.getPersonNumberAdult())
.reduce((a, b) => a + b, 0);
const output = isInt(sum) ? String(sum) : '-';

取决于你想要的行为。


推荐阅读