当前位置:
首页 >
NET问答: JS 中有 LINQ SelectMany 方法的等价实现吗?
发布时间:2023/12/4
48
豆豆
生活随笔
收集整理的这篇文章主要介绍了
NET问答: JS 中有 LINQ SelectMany 方法的等价实现吗?
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
咨询区
toddmo:
很遗憾,我在 Underscore 和 Jquery 中都没有找到对等实现,我的要求很简单,只要能做到 IE9 兼容即可。
我的 SelectMany 实现如下:
// SelectMany flattens it to just a list of phone numbers. IEnumerable<PhoneNumber> phoneNumbers = people.SelectMany(p => p.PhoneNumbers);回答区
Sagi:
基于简单起见,你可以使用 Array 提供的 reduce 方法,来看一下这个二维数组。
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 强对等了,原理很简单,用map将所有元素打散,然后将每一个被打散的结果插入到新的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)); }然后就是测试数据啦。
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)点评区
感觉现在的 es 外加 typescript ,花哨的写法比 C# 的 LINQ 复杂并强大多了,已经花里胡哨的看不懂了。。。大家认为呢?
总结
以上是生活随笔为你收集整理的NET问答: JS 中有 LINQ SelectMany 方法的等价实现吗?的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 如何绕过 TPM 2.0 安装 Wind
- 下一篇: 我居然手写了Spring框架