2015-04-03 4 views
1

У меня есть два массива адресов электронной почты, и я пытаюсь найти разницу в двух. Один из массивов содержит текущий адрес электронной почты. Другой содержит текущий адрес электронной почты членов группы. Я обновляю список групп с текущими адресами электронной почты и удаляя адрес в группе, которая не находится в текущих адресах электронной почты. Я не могу оборачивать голову тем, как я получаю цикл 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 { 

     } 
    } 

Кажется, мне нужно проверить конец моей петли или что-то в этом роде.

EDIT

Я использую Google Apps Script (SDK). Мне придется нажать все электронные письма, которые нужно удалить в массив, а затем использовать класс GroupApps для удаления этих писем из группы. Затем мне нужно будет нажать адрес электронной почты DOMAIN_USERS, который еще не находится в группе, группе. Итак, по существу, у меня будет два массива. Один массив писем, которые необходимо удалить из группы и один массив писем, которые необходимо добавить в группу. Надеюсь, это имеет смысл.

+0

Как раз так вы знаете, 'continue 'здесь заставляет программу отскакивать назад к началу вашего внутреннего цикла for (следующая итерация). Это может помочь, если мы увидим образцы массива 'GROUP_USERS' и' DOMAIN_USERS', и в конце концов вы хотите, чтобы они выглядели так. –

+0

@Cory Продолжает следующую итерацию –

+1

Не является ли результатом этого, что 'GROUP_USERS' будет таким же, как' DOMAIN_USERS'? Что вы хотите, если адрес находится в 'DOMAIN_USERS', но не в' GROUP_USERS', и наоборот? Пример ввода и желаемого выхода поможет. – Stuart

ответ

2

Вам нужно создать еще одну переменную, чтобы проверить CurrentMember существует в массиве DOMAIN_USERS после этого вы можете удалить его из массива 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--; 
    } 
} 
0

Если я правильно понимаю, что вы хотите, чтобы удалить все EmailAddresses из GROUP_USERS, которые не в DOMAIN_USERS, а затем добавить адрес электронной почты из DOMAIN_USERS, которые не находятся в GROUP_USERS, в массив GROUP_USERS, правильно?

Вы можете сделать первый «» содержит функцию (для совместимости вы можете использовать это вместо IndexOf()):

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

Затем удалить все EmailAddresses из GROUP_USERS, которые не DOMAIN_USERS. в цикле:

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

Тогда другой для петли, чтобы добавить те из 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]); 
    } 
} 
+0

Lol, или просто сделайте то, что user47448855 сказал, потому что после переосмысления логики, которую вы объяснили, он действительно прав, и GROUP_USERS просто станут DOMAIN_USERS – Guinn

1

Если я не уверен, непонимание логики такой же результат может быть достигнут с

GROUP_USERS = DOMAIN_USERS; 
+0

. Я должен был упомянуть, что я использую SDK Google Apps, поэтому я не могу просто сказать «GROUP_USERS = DOMAIN_USERS». – dericcain

0

, если вы ищете разницы в двух массивах
используют grip и inarray
demo

0

В 2 перечислены необходимые вам являются relative complement из GROUP_USERS в DOMAIN_USERS и из DOMAIN_USERS в GROUP_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

0

Его очень легко, используя открытый проект jinqJs

See Fiddle Example

//Use jsJinq.com open source library 
var current = ["[email protected]", "[email protected]", "[email protected]", "[email protected]"]; 
var group = ["[email protected]", "[email protected]", "[email protected]", "[email protected]"]; 

var currentComplex = [{email:"[email protected]"},{email: "[email protected]"}, {email:"[email protected]"}, {email:"[email protected]"}]; 

//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(); 
Смежные вопросы