2

現在、CoffeeScript でこれを行っています。

keys = (key for key of data)
values = (v for k,v of data)

はオブジェクトdataです (配列ではありません)。キーがプロパティ名の配列で、値が値の配列である 2 つの配列を作成しようとしています。

これは次のようにコンパイルされます。

var keys, values;
keys = (function() {
    var _results;
    _results = [];
    for (key in data) {
      _results.push(key);
    }
    return _results;
  })();
  values = (function() {
    var _results;
    _results = [];
    for (k in data) {
      v = data[k];
      _results.push(v);
    }
    return _results;
  })();

これらの 2 つのループを 1 つのループに結合できるようにしたいのですが、リスト内包表記を使用してこれを行う方法 (または可能かどうか) がわかりません。

私が行った別の試みは、2 つの配列を作成し、自分で項目をプッシュすることでした。

keys = []
values = []
keys.push k for k,v of data

これにより、キーを問題なくプッシュできますが、プッシュ先の構文もわかりませんvalues

1 つのリスト内包表記から 2 つの配列を作成するにはどうすればよいですか? 自分でループを書いたほうがいいですか?

4

2 に答える 2

2

最も簡単なのは自分自身をループすることだと思います:

keys = []
values = []
for key, value of data
   keys.push key
   values.push value

これは次のように変換されます

var key, keys, value, values;

keys = [];

values = [];

for (key in data) {
  value = data[key];
  keys.push(key);
  values.push(value);
}
于 2012-07-10T15:53:14.123 に答える
1

@ジミーの答えは、外部ライブラリを使用していない場合はおそらく最も簡単ですが、万が一すでにアンダースコアを使用している場合は、配列の[key, value]配列を生成してからzipそれらを一緒に生成できます。

[keys, values] = _.zip ([k, v] for k, v of data)...

スプラットの使い方は と同じ_.zip.apply(_, [k, v] for k, v of data)です。

于 2012-07-10T19:10:13.750 に答える