找出两个数组的差异

时间:2015-04-03 12:24:07

标签: javascript arrays

我有两个电子邮件地址数组,我试图找到两者的区别。其中一个数组包含当前的电子邮件地址。另一个包含当前组成员的电子邮件地址。我正在使用当前电子邮件地址更新组列表,并删除组中不在当前电子邮件地址中的地址。我无法理解如何通过我的for循环来实现这一目标。到目前为止,这是我的代码......

for(i = 0; i < GROUP_USERS.length; i++){
    var currentMember = GROUP_USERS[i];
    for(x = 0; x < DOMAIN_USERS.length; x++){
      if(DOMAIN_USERS[x] != currentMember){
        continue;
      } else {

      }
    }

似乎我需要测试循环结束或其他什么。

修改

我正在使用Google Apps脚本(SDK)。我将不得不将需要删除的所有电子邮件推送到阵列,然后使用GroupApps类从组中删除这些电子邮件。然后,我需要将尚未驻留在组中的DOMAIN_USERS电子邮件地址推送到该组。所以,基本上,我将有两个数组。需要从组中删除的一组电子邮件和需要添加到组中的一组电子邮件。希望这更有意义。

6 个答案:

答案 0 :(得分:2)

您需要创建另一个变量来检查DOMAIN_USERS数组中是否存在currentMember 之后,您可以将其从GROUP_USERS数组中删除

for (i = 0; i < GROUP_USERS.length; i++) {
    var currentMember = GROUP_USERS[i];
    var isContain = false;

    for (x = 0; x < DOMAIN_USERS.length; x++) {
        if (DOMAIN_USERS[x] == currentMember) {
            isContain = true;
        }
    }
    if (!isContain) {
        emailTobeRemove.pop(currentMember);
        i--;
    }
}

答案 1 :(得分:1)

除非我误解逻辑,否则可以用

达到相同的结果
GROUP_USERS = DOMAIN_USERS;

答案 2 :(得分:0)

如果我理解正确您要删除GROUP_USERS中不在DOMAIN_USERS中的所有电子邮件地址,请将GROUP_USERS中不在GROUP_USERS中的电子邮件地址添加到GROUP_USERS数组中,是吗?

你可以先制作一个&#39;包含&#39;函数(为了兼容性,你可以使用它而不是indexOf()):

function contains(arr, val) {
   for (var i = 0; i < arr.length; i++) {
      if (arr[i] === val) {
        return true;
      }
   }
   return false;
}

然后删除GROUP_USERS中不在DOMAIN_USERS中的所有电子邮件地址。在for循环中:

for(i=0;i < GROUP_USERS.length; i++) {
    if(!contains(DOMAIN_USERS, GROUP_USERS[i])) {
        GROUP_USERS.splice(i, 1);
    }
}

然后另一个for循环将DOMAIN_USERS中的那些添加到GROUP_USERS:

for(i=0; i < DOMAIN_USERS.length; i++) {
    if(!contains(GROUP_USERS, DOMAIN_USERS[i])) {
        GROUP_USERS.push(DOMAIN_USERS[i]);
    }
}

答案 3 :(得分:0)

如果你正在寻找两个阵列的差异
使用gripinarray
demo

答案 4 :(得分:0)

您需要的2个列表是DOMAIN_USERS中GROUP_USERS的relative complement和GROUP_USERS中的DOMAIN_USERS。因此,定义一个函数,查找不在第二个数组a中的数组b的所有成员,然后使用它来查找需要添加和删除的电子邮件。

function relComp(a, b) {
    var r = [];
    for (var i = 0; i < a.length; i++) {
        if (b.indexOf(a[i]) == -1) {
            r.push(a[i]);
        }
    }
    return r;
}
var toDelete = relComp(GROUP_USERS, DOMAIN_USERS);
var toAdd = relComp(DOMAIN_USERS, GROUP_USERS);

relComp也可以使用过滤器编写:

function relComp(a, b) {
    return a.filter(function(item) {
        return b.indexOf(item) == -1;
    });
}

JSFiddle

答案 5 :(得分:0)

使用开源项目jinqJs

非常容易

See Fiddle Example

//Use jsJinq.com open source library
var current = ["a@yahoo.com", "b@yahoo.com", "c@yahoo.com", "d@yahoo.com"];
var group   = ["a@yahoo.com", "d@yahoo.com", "yyy@yahoo.com", "xxx@yahoo.com"];

var currentComplex = [{email:"a@yahoo.com"},{email: "b@yahoo.com"}, {email:"c@yahoo.com"}, {email:"d@yahoo.com"}];

//Gets emails that are in current not in group
var result = jinqJs().from(current).not().in(group).select();
var result2 = jinqJs().from(currentComplex).not().in(group, 'email').select();