2

次のコードのエラー:-

var x = [{id: 'abc'}, {id: 'xyz'}];

var index = x.indexOf({id: 'abc'});

上記の構文は何ですか?

4

6 に答える 6

4

配列で定義したのとまったく同じオブジェクトへの参照を渡す必要があります。

var a = {id: 'abc'},
    b = {id: 'xyz'};

var index = [a, b].indexOf(a);  // 0
于 2013-11-14T14:16:23.407 に答える
2

オブジェクトは、オブジェクトのまったく同じインスタンスを参照している場合にのみ、互いに同等です。

独自の検索機能を実装する必要があります。例えば:

Array.prototype.indexOfObject = function(obj) {
    var l = this.length, i, k, ok;
    for( i=0; i<l; i++) {
        ok = true;
        for( k in obj) if( obj.hasOwnProperty(k)) {
            if( this[i][k] !== obj[k]) {
                ok = false;
                break;
            }
        }
        if( ok) return i;
    }
    return -1; // no match
};

var x = [{id: 'abc'}, {id: 'xyz'}];
var index = x.indexOfObject({id: 'abc'}); // 0
于 2013-11-14T14:26:08.913 に答える
1

次のように配列を反復処理します。

for(var i = 0, len = x.length; i < len; i++) {
    if (x[i].id === 'abc') {
        console.log(i);
        break;
    }
}

それ以外の場合は、探しているオブジェクトのポインターが同じであることを確認する必要がありますindexOf

于 2013-11-14T14:16:24.810 に答える
1

ここに素敵なコードを書きましょう ;)

Underscore.js は を提供しますがwhere、これも純粋な JS で書くのはかなり簡単です。

Array.prototype.where = function(props) {
    return this.filter(function(e) {
        for (var p in props)
            if (e[p] !== props[p])
                return false;
        return true;
    });
}

別の (より柔軟な) 関数は、オブジェクトまたは関数をセレクターとして認識します。

Array.prototype.indexBy = function(selector) {
    var fn = typeof selector == "function" ? selector :
        function(elem) {
            return Object.keys(selector).every(function(k) {
                return elem[k] === selector[k]
            })
        }
    return this.map(fn).indexOf(true); 
}

その後

var x = [{id: 'abc'}, {id: 'xyz'}];
x.indexBy({'id': 'xyz'}) // works
x.indexBy(function(elem) { return elem.id == 'xyz' }) // works too
于 2013-11-14T14:39:51.010 に答える
0
var o = {}
var x = [o]
console.log(x.indexOf(o))

x.indexOf({})新しいオブジェクトを作成すると、配列に存在しません

于 2013-11-14T14:16:13.350 に答える