0

次のようなスキーマがあるとしましょう。

users: {
   friends: [{name: String, id: String}]
}

このオブジェクト配列を 2 つの別個の配列に抽出する最速の方法は次のとおりです。

var names = [String]
var ids = [String]

forループなしでこれを行う方法はありますか? この操作は一連のユーザーに対して実行する必要があり、ネストされた for ループを回避しようとしています。友達の名前とIDを保存するためのより良い方法はありますか?

4

2 に答える 2

3

使用Array.map():

var names = users.friends.map(function(o) { return o.name; }),
    ids   = users.friends.map(function(o) { return o.id;   });
于 2013-01-19T13:51:28.847 に答える
2

どこかに常にループがあります (入れ子になったループとはどういう意味ですか?)。:)

最速を探している場合(これはあなたが言ったことです)、 amapまたは aを使用しても、forEach一般的に言えば、各反復が関数を呼び出すため、オーバーヘッドが追加されるため、操作が高速になります。

このjsPerfでわかるように、通常は for ループ構造を使用する方が適切です。まず、配列が長い場合は、配列を 1 回だけ (プロパティごとに 1 回ではなく) 通過することでメリットが得られます。さらに最適化するために、配列サイズを事前に宣言すると、パフォーマンスも向上します。

var names = new Array(totalFriends),
    ids = new Array(totalFriends), friend;

for (var j = 0; j < totalFriends; j++) {
  friend = friends[j];
  names[j] = friend.name;
  ids[j] = friend.id;
}

map 呼び出しは便利ですが、おそらく最速ではありません。

于 2013-01-19T15:35:21.943 に答える