Array.select() в javascript

Имеет ли javascript аналогичную функциональность, как Ruby?

array.select {|x| x > 3}

Что-то вроде:

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

Ответ 1

Существует 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, и он не отображается в спецификациях ECMAScript старше ES5 (спасибо Yi Jiang и jAndy), Таким образом, он может не поддерживаться другими диалоги ECMAScript, такими как JScript (на MSIE).

Ответ 2

Underscore.js является хорошей библиотекой для этих видов операций - он использует встроенные процедуры, такие как Array.filter, если они доступны, или использует свои собственные, если нет.

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

Документы дадут представление об использовании - синтаксис лямбда javascript нигде не близок, как рубин или другие (я всегда забываю добавить явный оператор возврата, например), а область видимости - еще один простой способ поймать, но вы можете сделать большинство вещей довольно легко, за исключением конструкций, таких как ленивые списки.

Из документов для .select() (.filter() является псевдонимом для того же самого)

Просматривает каждое значение в списке, возвращая массив всех значений, которые пройти тест на истинность (итератор). Делегирует собственный метод фильтра, если он существует.

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

Ответ 3

yo может расширить ваш 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);

Ответ 4

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 для более подробной информации