javascriptにはRubyと同様の機能がありますか?
array.select {|x| x > 3}
何かのようなもの:
array.select(function(x) { if (x > 3) return true})
javascriptにはRubyと同様の機能がありますか?
array.select {|x| x > 3}
何かのようなもの:
array.select(function(x) { if (x > 3) return true})
回答:
あります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がすべての主要なブラウザーでサポートされるようになりました。
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]
このような選択した方法で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);
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
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 を参照して ください。