array.select () у javascript


81

Чи має javascript подібну функціональність, як у Ruby?

array.select {|x| x > 3}

Щось на зразок:

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

Відповіді:


135

Є 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).

Оновлення від листопада 2020 року : Array.filter тепер підтримується у всіх основних браузерах.


6

Underscore.js - хороша бібліотека для таких видів операцій - вона використовує вбудовані підпрограми, такі як Array.filter, якщо такі доступні, або використовує власні, якщо ні.

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

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

З документів для .select () ( .filter () є псевдонімом для того самого)

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

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

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);

2
Ваш метод просто повертає перший елемент, який відповідає йому, не повертає масив, як це робить ruby. З невеликою зміною, хоча це буде: Array.prototype.select = function (test) {var new_array = [] for (var n = 0; n <this.length; n ++) {if (test (this [n])) {new_array.push (this [n]); }} повернути new_array; };
Ребека Вотербері

5

Є також Array.find() у ES6, який повертає перший знайдений відповідний елемент.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find

const myArray = [1, 2, 3]

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

console.log(myElement)
// => 2

4
цей просто повертає перший знайдений елемент
Джордж Бірбіліс

Це не те саме, що вибір Рубі.
sondra.kinsey

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 для більш докладної інформації


на kangax.github.io/compat-table/es5/#test-Array.prototype.filter, якщо вибрати "Застарілі платформи", а потім розширити "Методи масиву", вони бачать, що "array.prototype.filter" не підтримується на IE8
Джордж Бірбіліс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.