array.select()在JavaScript中

JavaScript是否具有与Ruby相似的function?

array.select {|x| x > 3} 

就像是:

 array.select(function(x) { if (x > 3) return true}) 

Array.filter()

 var numbers = [1, 2, 3, 4, 5]; var filtered = numbers.filter(function(x) { return x > 3; }); // As a JavaScript 1.8 expression closure filtered = numbers.filter(function(x) x > 3); 

请注意, Array.filter()不是标准的ECMAScript ,它不会出现在比ES5更早的ECMAScript规范中(感谢Yi Jiang和jAndy)。 因此,可能不支持其他ECMAScript方言,如JScript(在MSIE上)。

Underscore.js是这类操作的一个很好的库 – 它使用内置的例程,比如Array.filter(如果可用的话),或者如果没有,则使用它自己的。

http://documentcloud.github.com/underscore/

该文档将给出一个使用的想法 – JavaScript的lambda语法远不如ruby或其他人简洁(我总是忘记添加一个明确的返回语句为例),范围是另一个简单的方法被发现,但你可以做除了懒惰的列表parsing之外,大部分事情都很容易。

从文档.select()(. filter()是一个相同的别名)

查看列表中的每个值,返回传递真值testing(迭代器)的所有值的数组。 委托给本地filter方法(如果存在)。

  var evens = _.select([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; }); => [2, 4, 6] 

哟可以扩展你的JS像这样的select方法

 Array.prototype.select = function(closure){ for(var n = 0; n < this.length; n++) { if(closure(this[n])){ return this[n]; } } return null; }; 

现在你可以使用这个:

 var x = [1,2,3,4]; var a = x.select(function(v) { return v == 2; }); console.log(a); 

或数组中的对象

 var x = [{id: 1, a: true}, {id: 2, a: true}, {id: 3, a: true}, {id: 4, a: true}]; var a = x.select(function(obj) { return obj.id = 2; }); console.log(a); 

Array.filter没有在许多浏览器中实现,如果不存在,最好定义这个函数。

Array.prototype的源代码在MDN中发布

 if (!Array.prototype.filter) { Array.prototype.filter = function(fun /*, thisp */) { "use strict"; if (this == null) throw new TypeError(); var t = Object(this); var len = t.length >>> 0; if (typeof fun != "function") throw new TypeError(); var res = []; var thisp = arguments[1]; for (var i = 0; i < len; i++) { if (i in t) { var val = t[i]; // in case fun mutates this if (fun.call(thisp, val, i, t)) res.push(val); } } return res; }; } 

有关更多详细信息,请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter