it-swarm-ru.tech

array.select () в JavaScript

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

array.select {|x| x > 3}

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

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

Есть 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).

105
BoltClock

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

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

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

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

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

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

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

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

3
xinghua