jquery 排除数组元素

jquery exclude array elements

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

var myElements = $('.initial');

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

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

是否有删除的等效项,它也可以就地修改数组?类似于:

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

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

使用jquerynot方法,

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

您可以使用 delete 从数组中删除一个元素,然后使用 $.grep 删除空的 space。

//[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

您正在使用专用于数组文字的方法。 jQuery 已经有方法 add(),它将 return 修改后的 jQuery 对象,其中包含与选择器

匹配的元素
var myElements = $('.initial');
var newCollection = myElements.add('.to-add');    
newCollection.not('.to-remove').doSomething();

不要将 jQuery 对象视为数组,尽管它们 类似于 的数组。

引用add()

不清楚您的整体 objective 到底是什么,但很可能您可以使用 api

中已经存在的任意数量的过滤方法来管理它

假设你在寻找 a 中 b 的相对补码。 而且您不想在处理过程中创建其他对象。 该函数适用于普通数组和 jQuery 集。 (因此使用 $.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'));