为什么indexOf在数组中推送对象后没有工作

时间:2017-03-13 16:50:12

标签: javascript arrays indexof

我试图在indexOf推入数组后获取object。 当objext已经在数组中时,这不会返回与indexOf相同的值。

SCENARIO

var arr = [];
setInterval(function() {
	var path = { one: "f00"};
    if (typeof path !== "undefined") {
        if (arr.indexOf(path) === -1) {
            console.log("Not Exists!!")
            arr.push(path)
        } else {
            console.log("Exists!!")
        }
    }
	console.log(arr)
}, 2000)

的工作有什么不同

2 个答案:

答案 0 :(得分:1)

问题是JavaScript没有对对象进行深度比较,因此它不会将它们识别为相同。

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

但是,由于您可以在插入之前访问该对象,因此可以保存对该对象的引用,然后搜索该引用

var arr = []
var obj = { path: 'foo' }
arr.push(obj)
arr.indexOf(obj) // 0

这是因为indexOf使用strict equality === comparison。因此,在这种情况下,对obj的引用和arr[0]处的对象是相同的。

修改

根据您更改的问题,这是一种编写函数以执行所需操作的方法:

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更强大的选项,因为您的功能可能无法始终提供良好的参考,因此使用find / findIndex

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' });

答案 1 :(得分:0)

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