现在,我在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
的语法。
如何从单个列表推导中创建两个数组?我最好自己编写循环吗?
答案 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)
相同。