JavaScript中的array.select()

JavaScript中的array.select(),javascript,arrays,Javascript,Arrays,JavaScript是否具有与Ruby类似的功能 array.select {|x| x > 3} 比如: array.select(function(x) { if (x > 3) return true}) 存在Array.filter: 请注意,它不会出现在早于ES5的ECMAScript规范中,这要感谢Yi Jiang和jAndy。因此,其他ECMAScript方言(如MSIE上的JScript)可能不支持它 2020年11月更新:Array.filter适用于所有主要

JavaScript是否具有与Ruby类似的功能

array.select {|x| x > 3}
比如:

array.select(function(x) { if (x > 3)  return true})
存在Array.filter:

请注意,它不会出现在早于ES5的ECMAScript规范中,这要感谢Yi Jiang和jAndy。因此,其他ECMAScript方言(如MSIE上的JScript)可能不支持它


2020年11月更新:Array.filter适用于所有主要浏览器。

下划线.js是此类操作的良好库-如果可用,它使用内置例程,如Array.filter,如果不可用,则使用自己的例程

文档将给出一个使用的想法-javascript lambda语法远没有ruby或其他语法简洁,例如,我总是忘记添加显式返回语句,范围是另一种容易被发现的方法,但除了惰性列表理解等构造之外,大多数事情都可以很容易地完成

从docs for.select.filter是相同的别名

查看列表中的每个值,返回所需的所有值的数组 通过真理测试迭代器。委托给本机筛选器方法(如果存在)

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

你可以用这样的选择方法来扩展你的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 = [{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;
  };
}
看 有关更多详细信息,ES6中还有Array.find,它返回找到的第一个匹配元素


在某些情况下,您还可以使用映射功能,如下所示:

var celsiusValues=[22,50,310,0,80]; var kelvinValues=celsiusValues.mapfunctionx{return x-273;};
console.logkelvin值//[-251,-223,37,-273,-193]您的方法只返回与之匹配的第一项,而不像ruby那样返回数组。不过它会有一个小小的改变:Array.prototype.select=functiontest{var new_Array=[]forvar n=0;nvar 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);
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;
  };
}
const myArray = [1, 2, 3]

const myElement = myArray.find((element) => element === 2)

console.log(myElement)
// => 2