Javascript 在数组中搜索元素--*非*原始对象特定
像这样的Javascript 在数组中搜索元素--*非*原始对象特定,javascript,arrays,Javascript,Arrays,像这样的 var test = {a: 'a', b: 'b'}; var test2 = {a: 'a', b: 'b'}; var a = []; a.push(test); alert($.inArray(test2, a)); Test2=-1 测试=0 为什么会这样?对象应该是相同的,对吗?它在做什么样的比较 编辑: 澄清一些事情。下面的所有答案都非常有用。我使用一个数组来存储一对运行时值,即“页面”和“目录”。这些通常是分离的不相关值。我想设置一个包含特定对值的数组,并通
var test = {a: 'a', b: 'b'}; var test2 = {a: 'a', b: 'b'};
var a = [];
a.push(test);
alert($.inArray(test2, a));
Test2=-1
测试=0
为什么会这样?对象应该是相同的,对吗?它在做什么样的比较
编辑:
澄清一些事情。下面的所有答案都非常有用。我使用一个数组来存储一对运行时值,即“页面”和“目录”。这些通常是分离的不相关值。我想设置一个包含特定对值的数组,并通过创建一个对象,然后使用此方法搜索“允许的”对数组,来获得这两个不相关的密钥对关系
我将为此使用自定义搜索功能。非常感谢 有两个不同的对象(即使包含相同的值) 计算结果为
false
检查
一个
是一个数组,它的第一个元素是测试对象
inaray
测试传入数组中的任何数组元素是否与test
值相同。因此,您正在a数组中查找test2
对象。但是,test2
对象不在该数组中test2
可能与test
具有相同的内容,但它不是相同的对象
总之,你的问题是:
test != test2
因为它们不是同一个对象。它们的内容可能相同,但它们不是相同的对象
如果要比较相同内容的两个对象,请参阅上一篇文章:。您可以比较每个元素:
function compareObjects(a, b) {
var areEqual = true;
for (var key in a) {
if (b[key] !== a[key]) {
areEqual = false;
break;
}
}
for (var key in b) {
if (b[key] !== a[key]) {
areEqual = false;
break;
}
}
return areEqual;
}
或者序列化记录和字符串比较:
JSON.stringify({a: 1, b: 2}) === JSON.stringify({"a": 1, "b": 2}); // true
当您编写
{a:a',b:b'}
时,您正在用JavaScript创建一个新对象。再次写入时,将创建另一个对象,尽管两个对象包含相同的值。当您将其属性化为变量时,变量只包含每个对象的引用(“指针”)。当你写作时
var test = {a: 'a', b: 'b'};
var test2 = {a: 'a', b: 'b'};
有两个变量指向两个对象:
比较这两个变量时,只需比较指针。由于两个对象不同,指针不同,比较结果为false
。OTOH,如果你已经完成了下面的代码
var test = {a: 'a', b: 'b'};
var test2 = test;
结果是test
和test2
指向同一个对象并且相等
(更多关于参考文献的信息,也可以阅读)
您要做的是在$.inArray()函数中使用深度比较。如果您的目标只是比较值,我建议您使用。由于情况并非如此,而且$.inArray()
不接受比较器作为参数,我打赌您必须手动实现它:
function inArray(element, array) {
for (var key in array) {
if (_.isEqual(element, array[key])) {
return true;
}
}
return false;
}
编辑:如果我们的函数确实接收到比较器作为参数,那就太棒了
function inArray(element, array, cmp) {
if (typeof cmp != "function") {
cmp = function (o1, o2) {
return o1 == o2;
};
}
for (var key in array) {
if (cmp(element, array[key])) {
return true;
}
}
return false;
}
在Node.js中测试:
> inArray(test2, a)
false
> inArray(test2, a, function(o1, o2){return o1 === o2;})
false
> inArray(test2, a, _.isEqual)
true
当然,这会为您的特定问题带来更大的复杂性,因此您不需要使用它。但是,我认为注册这个想法可能是有效的:)有没有一种简单的方法来完成我想做的事情?检查这个答案:检查这个问题:
> inArray(test2, a)
false
> inArray(test2, a, function(o1, o2){return o1 === o2;})
false
> inArray(test2, a, _.isEqual)
true