Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.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_Arrays_Indexof - Fatal编程技术网

Javascript 为什么';在数组中推送对象后的工作索引

Javascript 为什么';在数组中推送对象后的工作索引,javascript,arrays,indexof,Javascript,Arrays,Indexof,我试图在将对象压入数组后获取对象的indexOf。 每当objext在数组中准备就绪时,这并不是像我那样返回相同的值 情景 var arr=[]; setInterval(函数(){ var path={one:“f00”}; 如果(路径类型!=“未定义”){ if(arr.indexOf(path)=-1){ console.log(“不存在!!”) arr.push(路径) }否则{ console.log(“存在!!”) } } 控制台日志(arr) }问题是JavaScript没有对

我试图在将
对象压入数组后获取
对象的
indexOf
。 每当objext在数组中准备就绪时,这并不是像我那样返回相同的值

情景


var arr=[];
setInterval(函数(){
var path={one:“f00”};
如果(路径类型!=“未定义”){
if(arr.indexOf(path)=-1){
console.log(“不存在!!”)
arr.push(路径)
}否则{
console.log(“存在!!”)
}
}
控制台日志(arr)

}问题是JavaScript没有对对象进行深入的比较,因此它无法识别它们是相同的

var a = { name: 'foo' }
var b = { name: 'foo' }
a === b // false
但是,由于您在插入之前可以访问该对象,因此可以保存对该对象的引用,然后搜索该引用:

这是因为使用了。因此,在这种情况下,对
obj
的引用与
arr[0]
处的对象是相同的

var a = { name: 'foo' }
var b = { name: 'foo' }
a === b // false
编辑

根据您已更改的问题,以下是一种编写函数以实现所需功能的方法:

var arr = [];

function findAdnSet(obj) {
  var index = arr.indexOf(obj);

  if (index !== -1) {
    return index;
  } else {
    arr.push(obj);
    return arr.length - 1; // No reason to use indexOf here, you know the location since you pushed it, meaning it HAS to be the last element in the array
  }
}

var path = { name: 'foo' };
findAndSet(path);
一个比使用
indexOf
更健壮的选项是使用/:


第一次执行索引时,推送并搜索对象“路径”,以便找到它。第二次创建对象并将其添加到数组中,然后搜索另一个新对象(恰好具有相同的值),但由于它不是您推送的同一对象,因此找不到它

如果在indexOf中使用对象,它可能不知道如何进行比较them@JohnSmiths因为您传递的是对该对象的直接引用,而不是另一个具有相同数据的对象@MikeMcCaughan no it not的可能重复项,所以第一个console.log返回正确的值“0”第二个控制台显示了-1我编辑的代码的可能重复,你能用这个例子来说明吗。为什么我不明白-1每次运行函数时,对路径的引用都会更改,因为每次运行函数时都会重新定义路径。在定义
setTimeout
调用之前,您必须保存
path
。这是因为我使用setInterval和forEach()来获取路径吗?嗯,我在代码中的任何地方都没有看到
forEach
,但是
setInterval
是。每次调用函数时,内部的一切基本上都是第一次发生的。当函数在两次运行之间结束时,函数的内部作用域(内存)将丢失。我添加了两个新的示例,这将对您有所帮助。
var arr = [];

function findAndSet(obj) {
  var index = arr.findIndex(function(item) {
    if (item.name === 'foo') {
      return true;
    }
  });

  if (index) { // findIndex returns `undefined` if nothing is found, not -1
    return index;
  } else {
    arr.push(obj);
    return arr.length - 1;
  }
}

// You don't need a reference anymore since our method is doing a "deep" compare of the objects
findAndSet({ name: 'foo' });