1

現在、json ドキュメント (マングースから返された) 内の配列をループし、以下のように特定の項目を探す実装があります。

だから何が起こっているのかidというと、リクエストヘッダーで を渡して表現することです。必要なのはstory.users.id.name、配列から関連付けられたものを取得することstory.usersです。次に、名前が send になったら、配列。

私は以下のようにこれをやろうとしました:

            for (var i = 0; i < story.users.length; i++) {
                if (story.users[i].id._id == req.headers.id) {
                   var name = story.users[i].id.name
                } else {
                    push.apns(story.users[i].id._id, name + " started a new story");
                }
            } 

ループして名前を取得してから、配列内の他のすべてのユーザーに対して何かを実行しますが、else引数が最初に発生するため、name変数が未定義になることがあります。

したがって、以下のように 2 つの if ループを実行することにしました。

            for (var i = 0; i < story.users.length; i++) {
                if (story.users[i].id._id == req.headers.id) {
                    var name = story.users[i].id.name
                }
            };
            for (var i = 0; i < story.users.length; i++) {
                if (story.users[i].id._id == req.headers.id) {
                } else {
                    push.apns(story.users[i].id._id, name + " started a new story");
                }
            }

しかし、配列を2回ループするよりも、上記のより良い方法があるに違いありませんか?

4

1 に答える 1

2

あなたがしていることは、正しい解決策のように見えます(あなたが持っているように見える目標を持っています)。ループを 1 回だけ実行する簡単な方法はありません。

ただし、より高速でクリーンにすることもできます。

var name; // this is just cleaner than to define it in the loop
for (var i = 0; i < story.users.length; i++) {
    if (story.users[i].id._id == req.headers.id) {
        name = story.users[i].id.name;
        break; // don't loop over the other elements
    }
};
for (var i = 0; i < story.users.length; i++) {
    if (story.users[i].id._id !== req.headers.id) {
        push.apns(story.users[i].id._id, name + " started a new story");
    }
}
于 2013-08-25T13:17:08.707 に答える