2017-07-15 31 views
0

我想在打字稿上使用Linq js庫。我有以下功能;如何在打字稿上使用linq js sum和average?

calculateAvgRating(data) { 
     this.user_ratings = Enumerable.from(data).groupBy(p => '${p.rating_type}', null, 
      function (key, g) { 
       var result = { 
        rating_type: key, 
        total: g.sum("$.rating"), 
        avg: g.average("$.rating") 
       } 
       return result; 
      }).toArray(); 
    } 

但是,我正在計算的總和平均線是給我下面的打字稿錯誤;

'string'類型的參數不能分配給 '(element:{})=> number'參數。

我知道,我需要改變我給總和和平均函數的參數,但我無法弄清楚。

+0

'$ {p.rating_type}' 不與rating_type'的'的價值,但'$ {p.rating_type}'的實際字符串值返回一個字符串。 groupBy方法需要返回一個數字。丟失字符串封裝。 –

+0

@ShanevandenBogaard當我刪除他們說的類型'{p:any; }'不能分配給類型爲'(元素:{key:string; value:any;})=> {}'的參數。 對象字面量只能指定已知屬性,'p'在類型'(元素:{key:string; value:any;})=> {}'中不存在。 – cano

回答

0

似乎linq.js庫的定義文件不支持簡寫(op.sum("$.value | 0")),儘管庫有。

您可以排除ts編譯器在庫上提示錯誤,這是不理想的,或者使用函數回調。

import { from } from 'linq'; 

interface IRating { 
    type: number, 
    value: number 
}; 

let data: IRating[] = [{ 
    type: 5, 
    value: 5.0 
}, { 
    type: 0, 
    value: 1.0 
}, { 
    type: 3, 
    value: 2.3 
}, { 
    type: 0, 
    value: 0.6 
}]; 


let result = from(data).groupBy(rating => rating.type, null, (key, op) => { 
    return { 
     type: key, 
     total: op.sum(item => item["value"] || 0), 
     avg: op.average(item => item["value"] || 0) 
    }; 
}).toArray(); 

console.log(result) 
+0

非常感謝 – cano