如何使用打字稿在Array <Model>中获得产品

时间:2019-11-18 13:28:37

标签: javascript typescript

我有一个数组,例如:

{
    "10-08": [
        { 
            "Items": [
                {
                    "RoomNum": 2
                }
            ], 
            "Dates": {
                "From": "2019-10-03T16:00:00.000Z",
                "To": "2019-10-08T16:00:00.000Z"
            } 
        }
    ],
    "10-09":[
        { 
            "Items": [
                {
                    "RoomNum": 3
                }
            ], 
            "Dates": {
                "From": "2019-10-07T16:00:00.000Z",
                "To": "2019-10-11T16:00:00.000Z"
            } 
        }
    ],

differenceInDays来自date-fns.js

现在,我想得到

(items.RoomNum  * differenceInDays(item.TravelDates.To,item.TravelDates.From))
+(items.RoomNum  * differenceInDays(item.TravelDates.To,item.TravelDates.From))...
and so on.

例如: 我想要得到:

2*5   +3*4  

我该怎么办?

2 个答案:

答案 0 :(得分:1)

这是使用reduce功能的绝佳机会,该功能是Javascript数组的功能。此函数将数组缩小减小到1个值。

语法如下:

const array = [1, 2, 3, 4, 5];
const sum = array.reduce(function(sumSoFar, currentElement) {
    return sumSoFar + currentElement;
}, 0 /* initial value of sumSoFar */);

console.log(sum); // 15

因此,在您的情况下,由于您已经将项目分组在一起,因此代码要复杂一些,但仍然不难。最终价格可以这样计算:

Object.keys(groups).reduce(function(sum, group) {
    return sum + differenceInDays(groups[group][0].Dates.To, groups[group][0].Dates.From) * groups[group][0].Items.reduce(function(subSum, item) {
        return subSum + item.RoomNum;
    }, 0);
}, 0);

之所以起作用,是因为乘法的分配属性表示a * (b + c) = a * b + a * c-我们可以将房间数相加,然后乘以天数,这两者都等于您发布的公式,并得出更清洁的/较短的代码。

答案 1 :(得分:0)

我认为我需要此代码:

 private buildNightNum(
    groups: Dictionary<Model[]>,
    item: string
  ) {
    let differenceFromTo = groups[item]
      .filter(t => t.Dates)
      .reduce(
        (a, b) => a + differenceInDays(b.Dates.To, b.Dates.From),
        0
      );
    let roomNum = groups[item]
      .filter(t => t.Items.filter(s => s.RoomNum))
      .reduce(
        (a, b) =>
          a +
          b.Items.filter(s => s.RoomNum)
            .map(s => s.RoomNum)
            .reduce((c, d) => c + d, 0),
        0
      ); 
    return   differenceFromTo* roomNum ;
  }