在数组

时间:2015-05-19 08:33:15

标签: javascript angularjs

我正在尝试使用以下代码搜索数组中的对象:

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

有效。唯一值将添加到我的输出数组中。但我想将值作为对象添加到我的数组中。

有什么不对?

3 个答案:

答案 0 :(得分:6)

您正在使用严格比较运算符(===)来比较两个完全不同的对象。这不起作用,即

{} === {} // Never true!

如果您需要整理看起来像重复项的对象,则需要使用其他机制,例如比较对象的属性。

我认为这可以归结为您希望如何在数组中定义“重复”对象。有两种可能性:

  1. 如果重复的对象多次出现在数组中,那么它只是重复的,但它仍然是内存中的同一个对象
  2. 如果对象的某些(或全部)属性与另一个对象的属性相同,则重复对象仅重复
  3. 根据你的情况,解决方案会有很大的不同,但通用的方法是循环内部的循环 - 主循环将接受数组中的一个对象,然后再次遍历同一个数组以查看它是否是不止一次在数组中。

    绝对有优化空间。也许你甚至可以重构你的代码,如果它首先看起来像是重复的,就不允许将对象插入到数组中。

答案 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
}