从列表理解创建两个数组

时间:2012-07-10 15:43:25

标签: coffeescript list-comprehension

现在,我在CoffeeScript中这样做:

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

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

这编译为:

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的语法。

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

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

如果您不使用外部库,

@Jimmy's answer可能是最简单的,但如果您已经使用了Underscore,则可以生成[key, value]数组的数组,然后zip他们在一起:

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

splats的使用与执行_.zip.apply(_, [k, v] for k, v of data)相同。