Javascript 比较一个数组中的项目

Javascript compare items in one array

本文关键字:数组 项目 一个 比较 Javascript      更新时间:2023-09-26

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

任何帮助将不胜感激!

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

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

对于较大的列表,比.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中有一个SetMap的对象可以更干净,更有效地完成这项工作。 对于用户查找,您可能会使用 Set 对象。

const goodUsers = new Set(["someUser1", "someUser2", "someUser3"]);
goodUsers.add("someUser4");
if (goodUsers.has(user)) {
    // user is in the set
}

蛮力方法如下所示:

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]);
    }
}

我喜欢这个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);
}​