Javascript随条件减少

时间:2018-08-01 12:26:06

标签: javascript functional-programming reduce

仅当累加器(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

感谢您的努力!

1 个答案:

答案 0 :(得分:3)

您的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) : '-';

取决于您想要的行为。