2

现在,我在 CoffeeScript 中这样做:

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

data对象(不是数组)在哪里。我正在尝试创建两个数组,其中键是属性名称的数组,值是值的数组。

这编译为:

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

我希望能够将这两个循环组合成一个循环,并且无法弄清楚如何(或是否可能)使用列表理解来做到这一点。

我所做的另一个尝试是创建两个数组并自己将项目推送给它们:

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

这让我可以很好地按下键,但我也无法弄清楚要推送的语法values

如何从单个列表理解创建两个数组?我最好自己编写循环吗?

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

如果您不使用外部库, @Jimmy 的答案可能是最简单的,但是如果您已经在使用 Underscore,您可以生成一个数组[key, value]数组,然后将zip它们一起生成:

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

splats 的用法和 do 一样_.zip.apply(_, [k, v] for k, v of data)

于 2012-07-10T19:10:13.750 回答