coffeescript - 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 个元素的两个元素的数组:
[
[ [], [], [], [] ],
[ [], [], [], [] ]
]
如何跳过第二级的数组?
解决方案
当您拆分两个推导时,更容易看到:
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
方法。但这将涉及对您的数组进行另一次迭代,因此如果性能很重要并且您拥有非常大的数据集,则不实用
推荐阅读
- python - 您如何计算文本文件中的两个单独的行并断言它们彼此相等?
- java - 仅 ANTLR 匹配声明
- javascript - Surveyjs 选择随机排序,除了一些值
- c# - 如何在运行应用程序时将进程列入黑名单/白名单(C#)
- javascript - 我应该使用什么事件来关闭 Electron 应用程序中的客户端 websocket?
- java - 操作栏图标未更新
- angular - 清除数组时使用 Dialog 回调导致错误
- wordpress - 在网站上使用 yoast 插件后卸载
- angular - 如何防止恶意用户从 localStorage 中获取令牌来调用 REST API
- javascript - 如何检测特定元素或 div 是否在 jQuery 中滚动?