javascriptのarray.select()


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ではなく、ES5より古いECMAScript仕様には表示されないことに注意してください(Yi JiangとjAndyに感謝します)。そのため、JScript(MSIE上)などの他のECMAScript方言ではサポートされていない可能性があります。

2020年11月の更新:Array.filterがすべての主要なブラウザーでサポートされるようになりました。


6

Underscore.jsは、この種の操作に適したライブラリです。使用可能な場合はArray.filterなどの組み込みルーチンを使用し、使用できない場合は独自のルーチンを使用します。

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

ドキュメントは使用のアイデアを提供します-javascriptラムダ構文はrubyや他のものほど簡潔ではありません(たとえば、明示的なreturnステートメントを追加することを常に忘れています)そしてスコープは捕らえられるもう1つの簡単な方法ですが、あなたはすることができます怠惰なリスト内包表記などの構造を除いて、ほとんどのものは非常に簡単です。

.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]); }} return new_array; };
Rebekah Waterbury 2013年


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
George Birbilis 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.