从Javascript代码中删除多个for循环

4
我正在为一个 web 应用程序编写代码,该应用程序需要定期筛选一个 JavaScript 对象数组以返回子集对象。我发现在我的代码中,我会得到大量的 for 循环。我计划编写一个可以使用传入函数返回筛选后的子集的原型函数,类似于 C# 的 LINQ lambda 或 Scala 的 filter 函数,但是我不禁想到这种方法是否已经被实现,无论是在核心语言中还是在外部库中,而我正在重新发明轮子。
是否有一种更受欢迎的方法来返回一个功能性筛选的 Json 子集对象,而不需要将 for 循环散布在我的代码中。 语法并不相关,但是具有类似于以下结构和概念的构造函数:
var filteredObj = obj.filter(function() {... filter function ...});

这是一个非常好的想法。目前我是一个C#团队中仅有的两个Web开发人员之一,我一直在寻找方法来帮助使JavaScript更像C#,以便他们不再害怕它。 - Zoidberg
因为JSON对象可以按层次结构定义,例如{"a": {"b": "1", "d": 2}, "b": {"c": "3", "d": "4"}},所以如果您的谓词函数返回任何具有键"b"的对象,那么过滤器的结果应该是什么对象就有点难理解了。所有匹配的子对象的数组?如果匹配的东西的子对象也被匹配了,那么它也应该被返回吗? - andrewmu
我同意你的观点,对象结构是{collection:[{object1:value, children:{children...}}, {object2:value, children:{children...}}, {object3:value, children:{children...}}]},过滤应该使用数组过滤而不是递归遍历对象树。我会尝试澄清我的问题。 - AlexC
4个回答

3

你看过underscore吗?

这个库有很多函数式编程工具,包括mapfilterreduce

该库中有很多非常棒的实用程序,使JavaScript变得更加函数化。


这似乎是我所寻找的最佳选择,但 jQuery grep() 也似乎是一个可行的选择。 - AlexC
grep()函数也可以使用,但是由于我来自Python背景,underscore中有很多有用的工具(haskeysvalueseach等),所以我几乎默认在我的网站上加载它。 - tkone

2
jQuery有一个grep()函数,可以过滤对象数组。
当需要递归或想要过滤每个对象的属性时,情况会变得很混乱,因为此时过滤函数可能依赖于上下文。

0

这实际上是一个非常好的想法。你可以做类似于这样的事情

Array.prototype.Where = function(filterFn){

   var i, results = [];

   for (i = 0; i < this.length; ++i){
      if (filterFn.call(this, this[i])){
          results.push(this[i]);
      }
   }

   return results;
};

这样做可以确保您的 JSON 中的每个数组都有一个 Where 方法,您可以使用它来过滤(就像 Linq 一样)。


0

如果你的目标受众是支持JavaScript 1.6及以上版本的浏览器,那么mapfilter已经成为核心语言的一部分,不需要库的支持。有趣的是,JavaScript 1.8还将数组 reduce方法引入了核心语言。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接