jquery排除数组元素

时间:2016-01-12 03:49:27

标签: javascript jquery arrays set set-operations

我有一系列元素,我想有效地维护,随着时间的推移添加和删除元素数组。

var myElements = $('.initial');

jquery' merge()似乎非常适合添加项目,因为它不会创建新数组,只会添加到现有数组中:

$.merge(myElements, $('.to-add'));

是否有相应的删除功能,还可以就地修改数组?类似的东西:

$.exclude(myElements, $('.to-remove'));

我确实有DOM元素数组,而选择器只是用作示例。

4 个答案:

答案 0 :(得分:2)

假设你在a的相对补充之后。 并且您不希望在处理过程中创建其他对象。 该函数适用于plain Array和jQuery set。 (因此使用$ .each,$ .inArray而不是Array.prototype.forEach Array.prototype.indexOf)

我写了一个符合你要求的功能。

$.exclude = function(a,b) {
    var idx;
    $.each(b, function(i, val) {
      while((idx = $.inArray(val, a)) !== -1) {
         a.splice(idx, 1);         
      }
    })
    return a;
}

在这里测试此代码 https://jsfiddle.net/happyhj/uwd4L1dm/8/

你可以这样使用。

$.exclude(myElements, $('.to-remove'));

答案 1 :(得分:1)

使用jquery not方法,

var filtered = $(myElements).not($('.to-remove'));

答案 2 :(得分:0)

您可以使用delete从数组中删除元素,然后使用$.grep删除空白区域。

//[0] since $("#id") will be a jquery Object
//[0] will return the particular DOM element

var orgArray = [$("#merge1")[0],$("#merge2")[0],$("#merge3")[0]];
var secArray = [$("#merge4")[0],$("#merge5")[0]]

// Will merge other two values; 
// jQuery merge will merge contents of 
//two array into first array

var merArray = $.merge(secArray, orgArray);

// Want to remove $("#merge2");

var getIndex = merArray.indexOf($("#merge2")[0]);
    if(getIndex >-1){
     delete merArray[getIndex] 
    }

// length before filtering
$("#l1").text(merArray.length);

//Now will remove Empty Space

merArray = $.grep(merArray,function(n){
 return n==0 || n
});
$("#l2").text(merArray.length);

JSFIDDLE

答案 3 :(得分:0)

您正在使用适用于数组文字的方法。 jQuery已经有方法add(),它将返回一个修改过的jQuery对象,该对象包含与选择器匹配的元素

var myElements = $('.initial');
var newCollection = myElements.add('.to-add');    
newCollection.not('.to-remove').doSomething();

不要将jQuery对象视为数组,尽管它们是数组

参考add()

目前尚不清楚您的总体目标是什么,但最有可能的是您可以使用api中已有的任何数量的过滤方法来管理它