Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中检查数组中对象(而不是字符串)索引的最快单行方法_Javascript_Optimization_Enumeration - Fatal编程技术网

在JavaScript中检查数组中对象(而不是字符串)索引的最快单行方法

在JavaScript中检查数组中对象(而不是字符串)索引的最快单行方法,javascript,optimization,enumeration,Javascript,Optimization,Enumeration,下划线的uxof.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 : -

下划线的uxof.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;
};
但它显然不适用于两个对象实例,即使它们具有相同的属性和值:

console.log({} === {}); // false
console.log({} == {}); // false
var o = {};
console.log(o === o); // true
如果数组中的项是对象类型的,这会使indexOf方法不起作用

问题是,在JavaScript中查找数组中对象索引的最佳方法是什么。一种方法是对每一项都使用JSON.stringif,这在性能方面没有意义。另一种方法是,如果toString返回的不是[object object],则为每个项调用toString,就像node.js的节点本机mongodb模块中的ObjectID一样,返回id字符串。第三种解决方案,可能是最常见的,是迭代每个对象中的每个键。这些都不是真正理想的


这个问题的建议解决方案是什么?

如果两个对象不相同,我认为没有比比较所有字段和值更好的方法来确定它们是否相等。好的,一个优化可以是检查他们的原型是否相同,然后检查他们自己的字段是否匹配。当然,前面的方法适用,这取决于你对身份的定义。如果我有两个对象:a={x:0};a、 _uuuproto_uuuu={y:1};和B= {x:0;y:1 },你认为它们是相同的吗?最好的解决方案将取决于具体的用例。如果可以轻松添加GetId方法,即每个对象都有一个唯一的ID,那么这种方法很可能是最好的方法。如果要比较对象,下划线的u.isEqual是一个不错的选择。答案
console.log({} === {}); // false
console.log({} == {}); // false
var o = {};
console.log(o === o); // true