【问题标题】:Javascript compare items in one arrayJavascript比较一个数组中的项目
【发布时间】:2012-06-18 23:00:50
【问题描述】:

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

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

使用 switch 语句是可行的,但我真的不喜欢它,而且我确信有更好的方法(用户列表在我查询时从设备动态填充):

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

任何帮助将不胜感激!

【问题讨论】:

    标签: javascript


    【解决方案1】:

    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

    【讨论】:

    • 请记住,一些较旧的浏览器没有Array.indexOf(),因此如果您希望它在这些浏览器中工作,您可能需要一个 shim。
    • 谢谢,效果很好!我也非常感谢 IndexOf 上的信息,我在上面看到的所有内容都没有解释未找到项目的 -1 值,这对测试至关重要。
    【解决方案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.')
           }
    }
        ​
    

    【讨论】:

    • 请记住,一些较旧的浏览器(如 IE7/IE8)没有 Array.indexOf(),因此如果您希望它在这些浏览器中工作,您需要一个 shim。
    • 由于某种原因,这不会为我返回错误的值,即使我添加了 else 值。它给好用户带来了很好的回报,但也不错。有任何想法吗? Alex Wayne 的方法对我有用,但我想弄清楚为什么没有。
    • 使用for...in 遍历数组时应该非常小心。
    【解决方案3】:

    对于较大的列表,比.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
    }
    

    【讨论】:

      【解决方案4】:

      蛮力方法是这样的:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多