javascript哈希中的唯一值

时间:2012-01-23 17:44:46

标签: javascript jquery arrays prototype

我需要将哈希值推送到数组中,只要它不包含我想要添加的哈希值。 例如,我有一个哈希数组:

var someArray = [
        {field_1 : "someValue_1", field_2 : "someValue_2"},
        {field_1 : "someValue_3", field_2 : "someValue_4"},
        {field_1 : "someValue_5", field_2 : "someValue_6"}
    ]

{field_1 : "someValue_1", field_2 : "someValue_2"}

不应该被推入数组,因为它已经存在,但值

{field_1 : "someValue_7", field_2 : "someValue_8"}

应该,因为数组不包含这样的值。

有没有办法用jQuery做到这一点?

现在我只使用$ .each循环并检查数组是否包含一些哈希值。如果它,我触发一个标志。但我不喜欢这个解决方案。

3 个答案:

答案 0 :(得分:2)

  1. 创建自定义原型以检查数组中是否存在对象。请检查下面的原型设计。
  2. Array.prototype.contains=function(x){
     for(i in this){
       if((x.field_1==this[i].field_1)&&(x.field_2==this[i].field_2))
         return true;  
     }
     return false;
    }
    
    1. 使用上面的原型,您可以检查数组中是否存在对象。
    2.  var someArray = [
              {field_1 : "someValue_1", field_2 : "someValue_2"},
              {field_1 : "someValue_3", field_2 : "someValue_4"},
              {field_1 : "someValue_5", field_2 : "someValue_6"}
          ];
      
      var a1={field_1 : "someValue_1", field_2 : "someValue_2"};
      var a2={field_1 : "someValue_7", field_2 : "someValue_8"};
      
      if(!someArray.contains(a1))   someArray.push(obj);  // it will NOT BE pushed
      if(!someArray.contains(a2))   someArray.push(obj); // it will be pushed
      

答案 1 :(得分:1)

或者,您可以扩充Array或将原型定义如下:

Array.prototype.add = function(element){
    var itemExists = false;
    for(var i=0;i<this.length;i++){
        if(this[i]==element){
            itemExists = true;
            break;
        }
    }
    if(itemExists==false)
        return this.push(element);
}

因此,使用[] .add(yourElement)只会将该元素添加到数组中(如果它尚不存在)。随意根据您的需要改变参数的结构和条件。

答案 2 :(得分:0)

我已经多次面对这个问题了,而且我一直在做的是编写一个函数,如果元素已经在给定的元素集中,则返回true。

function IsElementInSet(Element,Set)
{
    var ElementIsInSet=false;

    for(var i=0;i<Set.length;i++)
    {
        if(Set.field_1==Element.field_1&&Set.field_2==Element.field_2)
        {
                ElementIsInSet=true;
                break;
        }
    }

    return ElementIsInSet;
}

这就是我做事的方式。创建执行某些检查的函数,如果元素已经存在,则为true。

如果您正在使用大型数组并且感觉工作缓慢,还有其他可能的解决方案来优化搜索,但我怀疑您会这样做。

编辑:另外,关于使用并行结构来保存当前值 - 你会发现使普通数组(一维)只保存一个值非常棘手 - 在你的情况下它将是Element.field_1 + Element。 field_2(连接字符串)。然后你可以编写其他函数来检查这个数组中是否有给定的值。我认为这两个解决方案是相同的,它是关于风格而不是速度的问题。