2015-12-16 3 views
1

Я хочу простой способ сравнения двух массивов. Один массив имеет список писем, а другой массив - список электронных писем, которые заполнили форму. Затем я хочу вернуть список людей, которые не заполнили форму. Вот функция, которую я имею, но она работает довольно медленно.Сравнение строк массива пользователей для отображения пустых пользователей

function findMissingUsers() { 
    var sheet = getSheet();  
    users = [array of all emails]; 
    completedUsers = [array of emails who completed form]; 

    users.forEach(function (row) { 
    completedUsers.forEach(function (user) { 
    if(row.Email != user.Username) { 
     console.log(row); 
    } 
    }); 
    }); 
    } 

Просто пытайтесь найти более эффективный способ сделать это.

+0

отсортирован ли 'completedUsers' массив или легко сортируется? Если это так, вы можете попробовать использовать двоичный поиск 'finishedUsers' вместо последовательного поиска, и это должно быть' O (n log m) ', если я не ошибаюсь. – mcon

ответ

1

Как насчет:

completedUsers.filter(function(n) { 
    return users.indexOf(n) != -1 
}); 

из here.

+0

Вы пробовали? – rphv

+0

Его массив объектов, а не массив идентификаторов электронной почты (строка). – void

+0

@void согласно предоставленному коду оба являются массивами писем. – scareddragon

0

Вы можете использовать, например. lodash библиотека и _.difference функция. Подробности here.

0

Вы можете сделать это следующим образом:

var incompletedUsers = users.filter(function(user){ 
    return completedUsers.every(function(completedUser){ 
     return user.Email !== completedUser.Username; 
    }); 
}); 
Смежные вопросы