我需要将哈希值推送到数组中,只要它不包含我想要添加的哈希值。 例如,我有一个哈希数组:
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循环并检查数组是否包含一些哈希值。如果它,我触发一个标志。但我不喜欢这个解决方案。
答案 0 :(得分: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; }
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(连接字符串)。然后你可以编写其他函数来检查这个数组中是否有给定的值。我认为这两个解决方案是相同的,它是关于风格而不是速度的问题。