Javascript比较一个数组中的项目

时间:2012-06-18 23:00:50

标签: javascript

请原谅我完全缺乏javascript知识,但我似乎找不到如何比较两个数组并根据结果创建另一个数组的好例子。

我试图从存储设备获取用户帐户列表(使用javascript并处理好MOST功能),并将它们与静态创建的“好”用户列表进行比较。

使用switch语句有效,但我真的不喜欢它,我确信有更好的方法(当我查询时,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');
    } 
}

我想创建第三个“坏用户”数组,并将它们与“好用户”和“找到用户”的新数组进行比较。我已经开始:

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

然而,我无法找出多个for循环,if语句的正确组合,或以其他方式比较两者,并给我一个“坏用户”数组,我可以循环并执行操作。

任何帮助将不胜感激!

5 个答案:

答案 0 :(得分:3)

使用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.')
       }
}
    ​

答案 1 :(得分:3)

数组的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

答案 2 :(得分:1)

对于较大的列表,比.indexOf更有效的方法是将好用户列表放入对象并对该对象使用直接查找。这也适用于旧版浏览器,因为它不需要Array.indexOf()方法。

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

然后,您可以检查用户是否在该列表中:

if (goodUsers[user])

对于更长的列表,这比使用indexOf更有效率,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);

修改

虽然此对象查找仍然适用于现代Javascript,但ES6中现在有一个SetMap对象,可以更清晰,更有效地执行此操作。对于用户查找,您可能会使用Set对象。

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

if (goodUsers.has(user)) {
    // user is in the set
}

答案 3 :(得分: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]);
    }
}

答案 4 :(得分: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);
}​