CoffeeScript - 使用理解将对象转换为矩阵

CoffeeScript - transform object into a matrix using comprehensions

我有一个形式为 {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 个元素的两个元素的数组:

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

如何跳过二级数组?

拆分两个理解更容易看:

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, you could use the flatten 方法这样的实用程序库。但这将涉及对数组的另一次迭代,因此如果性能很重要并且您有非常大的数据集,则不切实际