如果元素对象在数组中,则不要推送相同的元素对象

时间:2017-05-13 16:52:24

标签: javascript jquery

我将元素对象添加到像这样的数组

window.elements = [];

var newElement = $(".element");
elements.push( newElement );

单击某个元素时,会使用上面的代码将其添加到数组中;如果我单击两次相同的元素,即使元素对象已经在数组中,也会再次添加相同的对象。

如何检查元素对象是否已存在于数组中;不要添加它。 我试过以下但是得到-1,即使它在数组中。

var newElement = $(".element");
if( jQuery.inArray( newElement, elements ) ) {
   elements.push( newElement );
}

5 个答案:

答案 0 :(得分:0)

这是因为jQuery.inArray使用===并且两个人对象永远不会与===相同,因为他们指的是引用不同的引用。当你执行$(selector)时,你总是得到一个新的Object。因此,它们是指向相同DOM元素的两个不同引用。

所以你可以做的是(一种可能的解决方案)向对象添加一个属性。

单击对象设置数据属性

var newElement = $(".element");
if( ! $(".element").attr("data-arr")) {
   elements.push( newElement );
   $(".element").attr("data-arr", true);
}

答案 1 :(得分:0)

您可以使用Array.Prototype.indexOf()方法,如果在数组中找不到指定的项目,则返回-1

if (elements.indexOf(newElement) === -1 {
  elements.push(newElement);
}

答案 2 :(得分:0)

var newElement = $(".element");
if( !jQuery.inArray( newElement, elements ) ) {
   elements.push( newElement );
}

答案 3 :(得分:0)

如果没有匹配,

inArray()将返回-1,如果它是数组中的第一个索引则返回零。因此,您必须与-1进行比较,因为0是假的

比较并将实际的dom元素推送到数组以避免使用不同的对象引用。

window.elements = [];

$('.someClass').click(function(){
   if( jQuery.inArray( this, elements ) === -1 ) {
      elements.push( this);
   }
})

简单地向元素添加一个类可能会更简单...然后过滤掉该类所有单击的类,让jQuery提供所需的数组。

答案 4 :(得分:0)

$(".element")不会返回单个元素。它返回包含class="element"的所有项的数组。您正在尝试将单击的项目添加到阵列。假设可点击项具有类元素,您可以这样做:

$('.element').click(function(){
    elements.push($(this));
    return false;
});