【问题标题】:Unique values in javascript hashjavascript哈希中的唯一值
【发布时间】:2012-02-17 01:37:41
【问题描述】:

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

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 循环并检查数组是否包含一些散列。如果是这样,我会触发一个标志。但我不喜欢这种解决方案。

【问题讨论】:

  • 所以你想实现一个复合唯一索引 - 我第二个 Felix 你试过什么?您将不得不对每次添加进行数组搜索。 someArray 中的数据是否已排序? (会简化搜索)
  • 现在我只是使用 $.each 循环并检查数组是否包含一些哈希。如果是这样,我会触发一个标志。但我不喜欢这个解决方案。
  • @Roman 另一个简单的选择是使用复合键保持并行散列。
  • @Dave Newton 你能举个例子吗?

标签: javascript jquery arrays prototype


【解决方案1】:
  1. 创建自定义原型以检查数组中是否存在对象。请检查下面的原型设计。
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. 使用上述原型,您可以检查对象是否存在于数组中。
 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 我同意,我的帖子是在您的帖子之后发布的。当我点击提交时,我看到了“新答案”通知。
【解决方案2】:

或者,您可以扩充 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) 只会将该元素添加到您的数组中(如果它尚不存在)。根据您的需要随意更改参数的结构和 if 条件。

【讨论】:

    【解决方案3】:

    这个问题我遇到过很多次,我总是写一个函数,如果元素已经在给定的元素集中,则返回 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(连接字符串)。然后你可以编写其他函数来检查这个数组中是否有给定的值。我认为这两种解决方案是相同的,都是风格问题,而不是速度问题。

    【讨论】:

      猜你喜欢
      • 2011-02-15
      • 2018-12-25
      • 1970-01-01
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 2018-02-04
      相关资源
      最近更新 更多