【问题标题】:Creating two arrays from list comprehension从列表理解创建两个数组
【发布时间】:2012-07-10 03:31:12
【问题描述】:

现在,我正在 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 的语法。

如何从一个列表推导创建两个数组?我自己编写循环会更好吗?

【问题讨论】:

  • 根据您的环境,您还可以使用Object.keys(data)获取密钥

标签: coffeescript list-comprehension


【解决方案1】:

我认为最简单的方法是自己循环:

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

【讨论】:

    【解决方案2】:

    如果您不使用外部库,@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)一样。

    【讨论】:

      猜你喜欢
      • 2022-12-08
      • 1970-01-01
      • 1970-01-01
      • 2015-04-29
      • 1970-01-01
      • 2020-02-27
      • 2014-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多