我试图在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)
的工作有什么不同
答案 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',以便找到它。第二次创建一个对象并将其添加到数组中,然后搜索另一个新对象(恰好具有相同的值),但由于它不是您推送的对象,因此找不到它。