1

事前にJavaScriptの知識がまったくないことをお許しください。ただし、2つの配列を比較し、その結果に基づいて別の配列を作成する方法の良い例を見つけることができないようです。

ストレージデバイスからユーザーアカウントのリストを取得し(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');
    } 
}

「悪いユーザー」の3番目の配列を作成し、それらを「良いユーザー」および「見つかったユーザー」の新しい配列と比較したいと思います。私は始めました:

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

ただし、複数のforループ、ifステートメント、またはその他の方法で2つを比較して、ループしてアクションを実行できる「不良ユーザー」の配列を取得するための正しい組み合わせを理解することはできません。

どんな助けでもいただければ幸いです!

4

5 に答える 5

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

于 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には、これをよりクリーンかつ効率的に実行できるオブジェクトがSetあります。Mapユーザールックアップには、おそらく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

強引な方法は次のようになります。

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 に答える
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 に答える