我正在尝试使用以下代码搜索数组中的对象:
function countUniqueBoxes(array,key)
{
var output = [];
var value = false;
var obj = false;
for(var i = 0; i < array.length; ++i)
{
value = array[i][key];
obj = {'Box': value};
if(output[i] === obj)
{
continue;
}
else
{
output.push(obj);
}
}
return output;
}
传递给此函数的数组包含具有重复值的多个对象。正如您所看到的,我正在尝试整理重复项,并插入唯一值,但相反,所有值都添加到我的输出数组中,甚至是重复值。
如果我喜欢这样:
for(var i = 0; i < array.length; ++i)
{
value = array[i][key];
if(output.indexOf(value) === -1)
{
output.push(value);
}
}
有效。唯一值将添加到我的输出数组中。但我想将值作为对象添加到我的数组中。
有什么不对?
答案 0 :(得分:6)
您正在使用严格比较运算符(===
)来比较两个完全不同的对象。这不起作用,即
{} === {} // Never true!
如果您需要整理看起来像重复项的对象,则需要使用其他机制,例如比较对象的属性。
我认为这可以归结为您希望如何在数组中定义“重复”对象。有两种可能性:
根据你的情况,解决方案会有很大的不同,但通用的方法是循环内部的循环 - 主循环将接受数组中的一个对象,然后再次遍历同一个数组以查看它是否是不止一次在数组中。
绝对有优化空间。也许你甚至可以重构你的代码,如果它首先看起来像是重复的,就不允许将对象插入到数组中。
答案 1 :(得分:1)
因为您直接比较代码中的对象,所以可以尝试:
if(output[i] output[i]['Box'] === obj['Box'])
{
continue;
}
在您的代码中,您需要在输出中执行另一个循环来进行比较,例如:
function isHasObj(output,obj){
for (var j = 0; j < output.length; ++j) {
if (output[j]['Box'] === obj['Box']) {
return true;
}
}
return false;
}
并更改if like:
if (isHasObj(output,obj)) {
continue;
}
else {
output.push(obj);
}
答案 2 :(得分:0)
您可以将javascript对象转换为json String,然后比较两个字符串。
JSON.stringify(obj1) === JSON.stringify(obj2)
x = {a: 47, b: 2};
y = {b: 2, a: 47};
if(JSON.stringify(x) === JSON.stringify(y) ){
//true
}else{
//false
}