【问题标题】:javascript delete from array based on another array with same object and valuesjavascript 基于具有相同对象和值的另一个数组从数组中删除
【发布时间】:2012-11-29 06:58:58
【问题描述】:

我有一个对象数组(所有相同的对象类型)。我有另一个相同对象类型的数组,我想用它来告诉我要从第一个数组中删除哪些对象。除了循环遍历所有属性并比较它们以找到第一个数组中与第二个数组中的元素 100% 匹配的元素然后从第一个数组中删除之外,是否还有一种简单的方法可以做到这一点?

我基本上是在一个对象数组上执行一个 jQuery.grep(),然后我想从传递给它的数组中删除这个 grep 的结果数组。

【问题讨论】:

  • 比较对象时如何检查相等性?
  • 每个属性都匹配。我要删除的始终是第一个数组的子集,只是通过 jQuery.grep() 找到要删除的对象的条件,我得到了这些对象的数组。现在我需要从我用 grep() 检查的第一个数组中删除这些对象。
  • 列出要删除的值的数组是否会在第二个数组中出现多次?

标签: javascript arrays


【解决方案1】:

不使用 jQuery.grep() 来获取新数组,将其替换为 jQuery.map(),如果必须保留则返回相同的对象,如果要删除则返回 null。

如果你的代码是

var toBeDeleted = $.grep(array, function(val) {
  return condition(val);
});

改成

array = $.map( array, function(val) {
  if(condition(val))
    return null;
  return val;
});

【讨论】:

  • 很高兴了解此功能。在这种情况下不打算使用它,但这给了我一个使用 delete() 方法扩展 jQuery 的想法,如果条件返回 true,则不要添加到返回数组,如果为 false,则添加到返回数组。这更适用于我正在制作的库之类的数据库。感谢您的帮助!
【解决方案2】:

如果它只是一个需要从另一个数组中删除的值数组,那么遍历数组真的很容易。

function deleteMatchingValues( target, toBeDeleted, oneMatch ) {
    var i = target.length, j = toBeDeleted.length;

    while( i-- ) {
        while( j--) {
            if( target[i] === toBeDeleted[j] ) {
                target.splice(i,1);
                if( oneMatch ) { break; }
            }
        }
        j = toBeDeleted.length;
    }
}

上面的函数包含一个参数,当你知道数组中只有一个值的实例时。

【讨论】:

  • 我不喜欢 dbl 循环。我想我要实现自己的 grep()/map() 样式并扩展 jQuery。在其中创建一个 delete() 如果返回 true,则不要添加到新数组,如果为 false,则将该元素添加到新数组并返回新数组。这样我只循环了 1 个主数组,应该可以节省很多次迭代。
猜你喜欢
  • 2021-06-07
  • 2015-06-19
  • 2021-10-26
  • 1970-01-01
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多