节点JS对象数组 - 获取indexOf

时间:2017-09-24 10:13:24

标签: arrays node.js object

我有一个对象数组。我试图在这个数组中找到一个对象的索引,但它总是返回-1,除非我"欺骗"。我无法看到这里的差异,它控制台.logs两种方式完全相同的输出。它只能单向工作......这是一个错误吗?

var arr = [{ un: 'test', uid: 1 }];
console.log("array",arr,typeof arr);

var obj = { un: 'test', uid: 1};
console.log("obj",obj);

console.log(arr[0],typeof arr[0]);
console.log("indexOf",arr.indexOf(obj));

arr.push(obj);
console.log(arr);
console.log("indexOf",arr.indexOf(obj));

输出是这样的:

array [ { un: 'test', uid: 1 } ] object
obj { un: 'test', uid: 1 }
{ un: 'test', uid: 1 } 'object'
indexOf -1
[ { un: 'test', uid: 1 }, { un: 'test', uid: 1 } ]
indexOf 1

对于我的生活,我看不出这里的差异。我错过了一些简单的东西吗?这是可能的......考虑到编码时间,简单的事情会被忽视。

1 个答案:

答案 0 :(得分:1)

在javascript中,对象总是引用对象本身(指向存储对象的内存地址的指针),所以这样做

var arr = [{ un: 'test', uid: 1 }];
var obj = { un: 'test', uid: 1};
console.log("obj",obj);

永远不会返回-1以外的任何内容,因为obj的地址与arr中的对象不同。这就是为什么,如果你在obj中推送arr它确实有效。

因此,以对象作为参数的Array.prototype.indexOf将查找相同的引用,而带有number,string,null的Array.prototype.indexOf将查找该值。

如果要查找具有特定属性的对象的索引,请使用:

var arr = [{ un: 'test', uid: 1 }];
var index = arr.findIndex(i => i.un === 'test' && i.uid === 1);

以下是findIndex的文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex