javascript是否具有与Ruby相似的功能?
array.select {|x| x > 3}
类似的东西:
array.select(function(x) { if (x > 3) return true})
答案 0 :(得分:105)
有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()
is not standard ECMAScript,它不会出现在比ES5更早的ECMAScript规范中(感谢Yi Jiang和jAndy)。因此,它可能不受其他ECMAScript方言的支持,例如JScript(在MSIE上)。
答案 1 :(得分:5)
Underscore.js对于这些类型的操作来说是一个很好的库 - 它使用内置例程,如Array.filter(如果可用),或者如果没有则使用它自己的。
http://documentcloud.github.com/underscore/
文档将提供使用的概念 - javascript lambda语法远不如ruby或其他(我总是忘记添加显式返回语句),而范围是另一种容易被抓住的方法,但是除了惰性列表推导等构造之外,你可以很容易地完成大部分工作。
来自 .select()的文档( .filter()是相同的别名)
查看列表中的每个值,返回所有值的数组 通过真相测试(迭代器)。委托自然过滤器方法(如果存在)。
var evens = _.select([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
=> [2, 4, 6]
答案 2 :(得分:5)
你可以使用像这样的选择方法扩展你的JS
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);
答案 3 :(得分:3)
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 了解更多详情
答案 4 :(得分:0)
在某些情况下,您还可以使用 map
函数,如下所示:
var celsiusValues = [22, 50, 310, 0, 80];
var kelvinValues = celsiusValues.map(function(x) { return x - 273; });
console.log(kelvinValues); //[-251, -223, 37, -273, -193]
或
var people = [ {name: 'Mary', gender: 0, age: 28 }, {name: 'Sara', gender: 0, age: 17 }, {name: 'Tom', gender: 1, age: 20 }];
var titles = people.map(function(x) { return (x.gender == 0? 'Mrs.' : 'Mr.') + x.name; });
console.log(titles); //["Mrs.Mary", "Mrs.Sara", "Mr.Tom"]
var ageVrification = people.map(function(x) { return x.age >= 18; });
console.log(ageVrification); //[true, false, true]
答案 5 :(得分:-1)
在ES6中还有Array.select
与Ruby的const myArray = [1, 2, 3]
const myElement = myArray.find((element) => element === 2)
console.log(myElement)
// => 2
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find
Property(t => t.Email)
.IsRequired()
.HasColumnName("Username");