比较两个数组并在正则表达式之后返回唯一值

3
我有两个数组。一个包含电子邮件列表,另一个包含匹配成功后应该被拒绝的字符串列表。
array1 = [ 'appstore@myntra.com',
  'life@updates.cricinfo.com',
  'pqr@gmail.com',
  'noreply-de9ae870@plus.google.com',
  'updates-24997849@shtyle.fm',
  'whatsup@gmail.com',
  'some@relatas.com',
  'smqwe@gmail.com' ]

array 2 = [ /calendar-notification/i,
  /feedproxy/i,
  /techgig/i,
  /team/i,
  /blog/i,
  /info/i,
  /support/i,
  /admin/i,
  /hello/i,
  /no-reply/i,
  /noreply/i,
  /reply/i,
  /help/i,
  /mailer-daemon/i,
  /googlemail.com/i,
  /mail-noreply/i,
  /alert/i,
  /calendar-notification/i,
  /eBay/i,
  /flipkartletters/i,
  /pinterest/i,
  /dobambam.com/i,
  /notify/i,
  /offers/i,
  /iicicibank/i,
  /indiatimes/i,
  /info@relatas.in/i,
  /facebookmail/i,
  /message/i,
  /facebookmail.com/i,
  /notification/i,
  /youcanreply/i,
  /jobs/i,
  /news/i,
  /linkedin/i,
  /list/i ]

array2包含了所有我想要拒绝的无效电子邮件。

我该如何比较这两个数组并从array1中删除无效电子邮件,以便得到

array3 = [ 'appstore@myntra.com',
  'life@updates.cricinfo.com',
  'pqr@gmail.com',
  'whatsup@gmail.com',
  'some@relatas.com',
  'smqwe@gmail.com' ]

1
除了循环遍历arr1中的每个值并且如果与arr2匹配则从arr1中删除该值,我没有看到其他的方法。这对您有用吗?或者您正在寻找优化的解决方案? - Kishore Bandi
这个方法可以运行,但是我们总是更倾向于寻找一个经过优化的解决方案。 - Naveen Paul
2个回答

2
您可以基本上对它们进行过滤:
var newArray = array1.filter(function (elem) {
    var ok = true
    array2.forEach(function (tester) {
        if (tester.test(elem)) {
            ok = false;
        }
    });
    return ok
});

更新

如@torazaburo所建议,使用some我们可以得到一个更加简洁的解决方案:

var newArray = array1.filter(function (elem) {
    return !array2.some(function (tester) {
        return tester.test(elem)
    });
});

1
我尝试了Thomas的修改,但它没有生效。Adam的原始版本是有效的。 - Naveen Paul
使用 some 替代 forEach - user663031
谢谢你的提示,@torazaburo,some更好。 - Adam

0

你已经用下划线标记了这个问题,所以我认为你使用下划线... 然后使用一个临时数组并进行巧妙的迭代:

var array_temp = [];

while(array1.length > 0) {
  var mail = array1.shift();
  _.each(array2, function(expression) {
    if(mail.match(expression)) {
      array3.push(mail);
    } else {
      array_temp.push(mail);
    }
  });
}

array1 = array_temp; array_temp = null;

抱歉,我忽略了array3应该保存剩余的邮件。我的方法展示了如何将邮件地址分成两个数组:一个包含有效地址,另一个包含无效地址。但我认为你已经看到了其中的奥妙,可以根据需要使用它。 - TeilZeitMensch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接