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