ECMA5数组方法 - 在数组中查找某种类型的第一个对象

时间:2013-09-12 19:53:47

标签: javascript arrays ecmascript-5

最近我发现自己使用了ECMA5提供的新阵列方法。我发现它必须经常重复的一项任务是在数组中找到满足特定条件的第一个(或唯一)对象。

您可以使用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]);  

1 个答案:

答案 0 :(得分:2)

ES5中没有内置方法。

ES6正在为此http://people.mozilla.org/~jorendorff/es6-draft.html#sec-22.1.3.8

添加Array.prototype.find
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);
    });
}());

我没有检查它,看它是否符合草案。