1

请原谅我事先完全缺乏 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 语句或其他方式的正确组合来比较两者并给我一个“坏用户”数组,我可以循环并对其执行操作。

任何帮助,将不胜感激!

4

5 回答 5

3

Array 的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

于 2012-06-18T23:07:46.217 回答
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.')
       }
}
    ​
于 2012-06-18T23:07:23.420 回答
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);

编辑:

虽然这个对象查找在现代 Javascript 中仍然有效,但现在 ES6 中有一个SetandMap对象可以更简洁、更有效地完成这项工作。对于用户查找,您可能会使用该Set对象。

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

if (goodUsers.has(user)) {
    // user is in the set
}
于 2012-06-19T00:01:30.483 回答
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);
}​
于 2012-06-18T23:22:50.030 回答
0

The brute force method would be something like this:

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]);
    }
}
于 2012-06-18T23:15:46.150 回答