在Array中搜索对象

Bry*_*yan 0 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;
}
Run Code Online (Sandbox Code Playgroud)

传递给此函数的数组包含具有重复值的多个对象.正如您所看到的,我正在尝试整理重复项,并插入唯一值,但相反,所有值都添加到我的输出数组中,甚至是重复值.

如果我喜欢这样做:

 for(var i = 0; i < array.length; ++i)
    {
        value = array[i][key];
        if(output.indexOf(value) === -1)
        {
            output.push(value);
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

怎么了?

Rob*_*ann 6

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

{} === {} // Never true!
Run Code Online (Sandbox Code Playgroud)

如果需要对类似于重复的对象进行排序,则需要使用其他机制,例如比较对象的属性.

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

  1. 如果重复对象多次出现在数组中,则它只是重复的,但它仍然是内存中的同一对象
  2. 如果对象的某些(或全部)属性与另一个对象的属性相同,则重复对象仅重复

根据您的情况,解决方案会有很大差异,但通用方法将是循环内的循环 - 主循环将接受数组中的一个对象,然后再次遍历同一个数组以查看它是否在数组中不止一次.

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