javascript中的array.select()

时间:2011-02-14 08:41:16

标签: javascript arrays

javascript是否具有与Ruby相似的功能?

array.select {|x| x > 3}

类似的东西:

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

6 个答案:

答案 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");