2012-06-18 4 views
1

Простите, что я полностью не знаю javascript, но я не могу найти хороший пример того, как сравнить два массива и создать другой массив на основе результатов.Javascript сравнить товары в одном массиве

Я пытаюсь получить список учетных записей пользователей с устройства хранения (использует javascript и обрабатывает функции MOST в порядке) и сравнивает их со статически созданным списком «хороших» пользователей.

с помощью переключателя выписки работает, но я действительно не нравится, и я уверен, что есть намного лучший путь (USERLIST заполняется динамически из устройства, когда я запрашиваю его):

for (userName = 0; userName < userList.length; userName++) { 
    switch (userList[userName]) { 
    case 'someuser1': 
      printf('Username: ' + userList[userName] + ' is good\n'); 
      break; 
    case 'someuser2': 
      printf('Username: ' + userList[userName] + ' is good\n'); 
      break; 
    case 'someuser3': 
      printf('Username: ' + userList[userName] + ' is good\n'); 
      break; 
    default: 
      printf('Username: ' + userList[userName] + ' is NOT good\n'); 
    } 
} 

I хотел бы создать третий массив «плохих пользователей» и сравнить их с новым массивом «хороших пользователей» и «найти пользователей». Я начал с:

var goodUsers = ["someuser1", "someuser2", "someuser3"]; 

Однако я не могу понять, правильное сочетание нескольких петель для, если заявления или иначе сравнить два и дать мне массив «плохих пользователей», что я могу перебирать и выполнять действия против.

Любая помощь будет оценена!

ответ

1

Array's indexOf метод сладкий. Он возвращает позицию элемента в массиве, если он существует, или возвращает -1, если это не так.

var goodUsers = ["someuser1", "someuser2", "someuser3"]; 
var users = ["someuser1", 'basuser']; 
var user; 

for (var i=0; i < users.length; i++) { 
    user = users[i]; 
    if (goodUsers.indexOf(user) >= 0) { 
    console.log(user + ' is a good user'); 
    } else { 
    console.log(user + ' is BAD!!!'); 
    } 
}​ 

http://jsfiddle.net/qz5fx/1

+0

Просто имейте в виду, что некоторые старые браузеры не имеют 'Array.indexOf()', поэтому вам может понадобиться прокладка, если вы хотите, чтобы она работала в этих браузерах. – jfriend00

+0

Спасибо, это сработало отлично! Я очень ценю информацию об IndexOf, все, что я видел на ней, не объясняло значение -1 для не найденных элементов, и это очень важно для теста. – nvrmore100

2

Используйте indexOf, чтобы узнать, существует ли пользователь в вашем массиве.

var goodUsers = ["someuser1", "someuser2", "someuser3"]; 
var storedUsers = ["someuser1", "user", "user3"]; 
for(var goodUser in goodUsers){ 
    if(storedUsers.indexOf(goodUsers[goodUser])>-1){ 
     console.log('User:' + goodUsers[goodUser] + ' is good.') 
     } 
} 
    ​ 
+0

Просто имейте в виду, что некоторые старые браузеры (например, IE7/IE8) не имеют 'Array.indexOf()', так что вы должны были бы прокладку, если вы хотите работать в этих браузерах. – jfriend00

+0

По какой-то причине это не возвращает плохие значения для меня, даже когда я добавляю значение else. Он возвращает хороших пользователей, но неплохо. Есть идеи? Метод Алекс Уэйн работает для меня, но я пытаюсь понять, почему этого не случилось. – nvrmore100

0

Грубый метод сила будет что-то вроде этого:

var users = []; // here is where you get the users from the device 
var goodUsers = []; // here you get your good users list 
var badUsers = []; // initialize an empty array for bad users 

for (var i=0; i< users.length; i++) { 
    var isAGoodUser = false; 
    for(var y=0; y< goodUsers.length; y++) { 
     if(users[i] == goodUsers[y]) { 
      printf('Username: ' + users[i] + ' is good\n'); 
      isAGoodUser = true; 
      break; 
     } 
    } 
    if(!isAGoodUser){ 
     printf('Username: ' + users[i] + ' is NOT good\n'); 
     badUsers.push(users[i]); 
    } 
} 
0

Мне нравится метод indexOf для этого. Пример скрипка: http://jsfiddle.net/8MV3J/

var good = ["someuser1", "someuser2", "someuser3"]; 
var bad = []; 
var ugly = ["someuser4", "someuser1", "someuser5", "someuser2", "someuser6", "someuser3", "someuser7"]; 
var i = 0; 
var li; 

for (i = 0; i < ugly.length; i += 1) { 
    if (good.indexOf(ugly[i]) === -1) { 
     bad.push(ugly[i]); 
    } 
} 

for (i = 0; i < bad.length; i += 1) { 
    li = $('<li />').text(bad[i]); 
    $('ul#bad').append(li); 
}​ 
1

Для больших списков, более эффективный способ, чем .indexOf, чтобы поставить хороший список пользователей в объект и использовать прямой поиск на этом объекте. Это также работает в старых браузерах, поскольку для этого не требуется метод Array.indexOf().

var goodUsers = { 
    "someuser1": true, 
    "someuser2": true, 
    "someuser3": true 
}; 

Затем вы можете проверить, если пользователь находится в списке с:

if (goodUsers[user]) 

Для более длинных списков, это намного эффективнее, чем использование IndexOf, которые просто перебирает массив сравнения каждый элемент в массиве к вашей цели, потому что используется хэш-поиск (например, хеш-таблица).

Если у вас есть набор кандидатов пользователей, и вы хотели бы знать, какие из них были в goodUsers списке, вы могли бы сделать это так:

var goodUsers = { 
    "someuser1": true,  
    "someuser2": true,  
    "someuser3": true 
}; 

var candidateUsers = ["someuser4", "someuser1", "someuser5", "someuser2", "someuser6", "someuser3", "someuser7"]; 

function checkUsers(candidates) { 
    var goods = []; 
    for (var i = 0, len = candidates.length; i < len; i++) { 
     var item = candidates[i]; 
     if (goodUsers[item]) { 
      goods.push(item); 
     } 
    } 
    return(goods); 
} 

var validUsers = checkUsers(candidateUsers); 

Edit:

Хотя этот поиск объектов по-прежнему работает в современном Javascript, теперь в ES6 есть объект Set и Map, который может сделать это более чистым и более эффективным. Для поиска пользователя вы, вероятно, используете объект Set.

const goodUsers = new Set(["someUser1", "someUser2", "someUser3"]); 
goodUsers.add("someUser4"); 

if (goodUsers.has(user)) { 
    // user is in the set 
} 
Смежные вопросы