NET问答: JS 中有 LINQ SelectMany 方法的等价实现吗?

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 方法的等价实现吗?的主要内容,如果未能解决你的问题,请参考以下文章

在JS和.NET中使用JSON (以及使用Linq to JSON定制JSON数据)

.NET 6 带有实体框架的新 LINQ 功能

如何使用 LINQ 将空值发送到 ASP.NET 中的非空列

net core 通过js打印集合(创建树)

什么是Linq to SQL相当于TOP或LIMIT / OFFSET?

VB.Net Linq to Entities Null 比较 - “啥都没有”或“= 啥都没有”?