アンダースコアの_.indexOf
メソッドは次のようになります。
var nativeIndexOf = Array.prototype.indexOf;
_.indexOf = function(array, item, isSorted) {
if (array == null) return -1;
var i, l;
if (isSorted) {
i = _.sortedIndex(array, item);
return array[i] === item ? i : -1;
}
if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);
for (i = 0, l = array.length; i < l; i++) if (i in array && array[i] === item) return i;
return -1;
};
そのメソッドの下部に向かって、ネイティブindexOf
実装を使用しようとします。それ以外の場合は、2つを恒等演算子と比較し===
ます。
恒等演算子===
は、次のようなプリミティブオブジェクトに対して機能します。
console.log("asdf" === "asdf"); // true
console.log(1 === 1); // true
console.log(1 === 1.0); // true
console.log(null === null); // true
console.log(undefined === undefined); // true
Object
ただし、プロパティと値が同じであっても、2つのインスタンスでは明らかに機能しません。
console.log({} === {}); // false
console.log({} == {}); // false
var o = {};
console.log(o === o); // true
これにより、indexOf
配列内の項目がObject
型の場合、メソッドは機能しなくなります。
Object
問題は、 JavaScriptで配列内ののインデックスを見つけるための最も最適化された方法は何ですか。1つの方法は、JSON.stringify(o)
すべてのアイテムに対してですが、パフォーマンスに関しては意味がありません。もう1つはtoString()
、すべてのアイテムを呼び出すことです(node.jsのnode-native-mongodbモジュールでObjectIDが行うように、toString()
以外のものを返す場合は、ID文字列を返します)。[object Object]
おそらく最も一般的な3番目の解決策は、各オブジェクトの各キーを反復処理することです。これらのどれも本当に理想的ではありません。
この問題の推奨される解決策は何ですか?