在JavaScript中检查数组中indexOf Object(非String)的最快单行方式

时间:2012-05-04 23:29:17

标签: javascript optimization enumeration

下划线的_.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实现,否则它将两者与身份运算符===进行比较。

身份运算符===适用于以下原始对象:

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个实例,即使它们具有相同的属性和值:

console.log({} === {}); // false
console.log({} == {}); // false
var o = {};
console.log(o === o); // true

如果数组中的项目属于indexOf类型,则Object方法无效。

问题是,在JavaScript中查找数组中Object索引的最佳方法是什么。一种方法是JSON.stringify(o)每个项目,这不是明智的表现。另一种方法是为每个项调用toString()(如果toString()返回[object Object]以外的内容,就像ObjectID在node.js的node-native-mongodb模块中那样,返回一个id字符串) 。第三种解决方案,可能是最常见的,是迭代每个对象中的每个键。这些都不是真正理想的。

这个问题的推荐解决方案是什么?

0 个答案:

没有答案