1

最近、ECMA5 が提供する新しい配列メソッドを頻繁に使用していることに気づきました。頻繁に繰り返さなければならないタスクの 1 つは、特定の基準を満たす配列内の最初の (または唯一の) オブジェクトを見つけることです。

Array.some を使用して存在するかどうかを確認できますが、これは bool を返すだけです。代わりに Array.filter を使用していますが、アイテムが見つかったときにループが停止しないため、これはループよりも効率的ではありません。私が見逃した方法で、私が望むものにハッキングできる方法はありますか?

var things = [
    {name: "house"},
    {name: "table"},
    {name: "egg"},
    {name: "bob"},   
    {name: "hamster"}
];

var getBob = function(thing){
    return thing && thing.name == "bob";
};

// returns true not the object i want
console.log(things.some(getBob)); 
// returns the object but in an array and does not break when found
console.log(things.filter(getBob)[0]);  
4

1 に答える 1

2

ES5 にはそのための組み込みメソッドはありません。

ES6 はArray.prototype.findこれに追加していますhttp://people.mozilla.org/~jorendorff/es6-draft.html#sec-22.1.3.8

console.log(things.find(getBob));

これはhttps://gist.github.com/dcherman/5167353から適応したポリフィルです

(function() {    
    function polyfill(fnName) {
        if (!Array.prototype[fnName]) {
            Object.defineProperty(Array.prototype, fnName, {
                value: function( predicate /*, thisArg */ ) {
                    var i, len, test, thisArg = arguments[ 1 ];

                    if ( typeof predicate !== "function" ) {
                        throw new TypeError();
                    }

                    test = !thisArg ? predicate : function() {
                        return predicate.apply( thisArg, arguments );
                    };

                    for( i = 0, len = this.length; i < len; i++ ) {
                        if ( test(this[i], i, this) === true ) {
                            return fnName === "find" ? this[ i ] : i;
                        }
                    }

                    if ( fnName !== "find" ) {
                        return -1;
                    }
                },
                enumerable: false,
                writable: true,
                configurable: true
            });
        }
    }

    [ 'find', 'findIndex' ].forEach(function(method) {
        polyfill(method);
    });
}());

ドラフトにどれだけ準拠しているかは確認していません。

于 2013-09-13T03:23:38.457 に答える