當(dāng)前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
NET问答: JS 中有 LINQ SelectMany 方法的等价实现吗?
生活随笔
收集整理的這篇文章主要介紹了
NET问答: JS 中有 LINQ SelectMany 方法的等价实现吗?
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
咨詢區(qū)
toddmo:
很遺憾,我在 Underscore 和 Jquery 中都沒有找到對等實現(xiàn),我的要求很簡單,只要能做到 IE9 兼容即可。
我的 SelectMany 實現(xiàn)如下:
//?SelectMany?flattens?it?to?just?a?list?of?phone?numbers. IEnumerable<PhoneNumber>?phoneNumbers?=?people.SelectMany(p?=>?p.PhoneNumbers);回答區(qū)
Sagi:
基于簡單起見,你可以使用 Array 提供的 reduce 方法,來看一下這個二維數(shù)組。
var?arr?=?[[1,2],[3,?4]]; arr.reduce(function(a,?b){?return?a.concat(b);?},?[]); =>??[1,2,3,4]var?arr?=?[{?name:?"name1",?phoneNumbers?:?[5551111,?5552222]},{?name:?"name2",phoneNumbers?:?[5553333]?}]; arr.map(function(p){?return?p.phoneNumbers;?}).reduce(function(a,?b){?return?a.concat(b);?},?[]) =>??[5551111,?5552222,?5553333]不過在 es6 中,Array 新增了 flatMap 方法,這就和 SelectMany 強(qiáng)對等了,原理很簡單,用map將所有元素打散,然后將每一個被打散的結(jié)果插入到新的array中,下面是它的 TypeScript 簽名。
function?flatMap<A,?B>(f:?(value:?A)?=>?B[]):?B[]接下來就可以flat你的 phoneNumbers 啦。
arr.flatMap(a?=>?a.phoneNumbers);Cem Tu?ut:
其實非常簡單,你可以在 es6 中自定義個 SelectMany 方法,定義如下:
Array.prototype.SelectMany?=?function?(keyGetter)?{return?this.map(x=>keyGetter(x)).reduce((a,?b)?=>?a.concat(b));? }然后就是測試數(shù)據(jù)啦。
var?juices=[{key:"apple",data:[1,2,3]},{key:"banana",data:[4,5,6]},{key:"orange",data:[7,8,9]}];到這里就可以做到和 LINQ 中的 SelectMany 一樣的使用方法啦。
juices.SelectMany(x=>x.data)點評區(qū)
感覺現(xiàn)在的 es 外加 typescript ,花哨的寫法比 C# 的 LINQ 復(fù)雜并強(qiáng)大多了,已經(jīng)花里胡哨的看不懂了。。。大家認(rèn)為呢?
總結(jié)
以上是生活随笔為你收集整理的NET问答: JS 中有 LINQ SelectMany 方法的等价实现吗?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何绕过 TPM 2.0 安装 Wind
- 下一篇: gradle idea java ssm