首页 > 解决方案 > CoffeeScript - 使用推导将对象转换为矩阵

问题描述

我有一个形式的对象:{a: [1,2,3,4], b: [5,6,7,8]}并且我想使用理解将其转换为包含 3 个项目的数组的数组:

[
  ['a', 0, 1], ['a', 1, 2], ['a', 2, 3], ['a', 3, 4],
  ['b', 0, 5], ['b', 1, 6], ['b', 2, 7], ['b', 3, 8]
]

我试过这个( [x,y,v] for v, y in h for x, h of obj ),但它给出了一个包含 4 个元素的两个元素的数组:

[ 
  [ [], [], [], [] ],
  [ [], [], [], [] ]
]

如何跳过第二级的数组?

标签: coffeescriptdataset

解决方案


当您拆分两个推导时,更容易看到:

result = for x, h of obj
  for v, y in h 
    [x,y,v] 

您的结果将是 2 级深,因为每个理解都返回一个数组。

第一个深度数组将为对象中的每个元素提供一个数组。

这些数组中的每一个都将包含对象中一个键的结果


解决此问题的最佳方法是将所需的 3 个元素数组中的每一个推入一个单独的数组中。

result = []
for x, h of obj
  for v, y in h
    result.push [x,y,v]

或者使用紧凑格式:

result = []
result.push [x,y,v] for v, y in h for x, h of obj 

如果您已经拥有像lodash这样的实用程序库,则可以使用该flatten方法。但这将涉及对您的数组进行另一次迭代,因此如果性能很重要并且您拥有非常大的数据集,则不实用


推荐阅读