从列表推导式创建两个数组

3

目前,我正在使用CoffeeScript进行以下操作:

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

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

这将编译为:

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

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


根据您的环境,您还可以使用Object.keys(data)获取键。 - Ricardo Tomasi
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);
}

1

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接