JS 中有 LINQ SelectMany 方法的等价实现吗?

发布于 2024-02-17 14:15:45 字数 1766 浏览 14 评论 0

咨询区

很遗憾,我在 Underscore 和 Jquery 中都没有找到对等实现,我的要求很简单,只要能做到 IE9 兼容即可。

我的 SelectMany 实现如下:

// SelectMany flattens it to just a list of phone numbers.
IEnumerable<PhoneNumber> phoneNumbers = people.SelectMany(p => p.PhoneNumbers);

回答区

基于简单起见,你可以使用 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);

其实非常简单,你可以在 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 复杂并强大多了,已经花里胡哨的看不懂了,大家认为呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84960 人气
更多

推荐作者

qq_E2Iff7

文章 0 评论 0

Archangel

文章 0 评论 0

freedog

文章 0 评论 0

Hunk

文章 0 评论 0

18819270189

文章 0 评论 0

wenkai

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文