JavaScript中如何实现等效的数组unzip(解压缩)操作
PsychoPy环境下JavaScript数组unzip实现方案
需求说明
- 存在两个索引位置一一对应的关联列表,需要在保留元素配对关系的前提下打乱列表顺序,打乱完成后再拆分回两个独立列表
- 已掌握PsychoPy/Pavlovia环境下可用的数组zip、打乱方法,但通用JavaScript的unzip方案无法在该环境正常运行
- 需要实现等效于Python语句
adult, child = zip(*animals)的解压缩逻辑
Python参考实现逻辑
Python下的标准实现流程为:zip配对→打乱顺序→unzip拆分,示例代码如下:
# 引入打乱函数 shuffle = util.shuffle # 定义两组关联列表 adult = ["cat", "dog", "chicken"] child = ["kitty", "puppy", "chick"] # 配对后打乱,保留配对关系 animals = list(zip(adult, child)) random.shuffle(animals) # unzip拆分回两个独立列表 adult, child = zip(*animals) adult = list(adult) child = list(child)
现有可用的JavaScript zip+打乱代码
以下代码已验证可在Pavlovia平台的PsychoJS环境正常运行:
// 注意变量对应:示例中child为第二组关联列表 animals = [] for (let Idx = 0; Idx < adult.length; Idx++) { animals.append([adult[Idx], child[Idx % child.length]]) } shuffle(animals)
适配PsychoJS环境的unzip实现
网上常见的unzip方案多依赖
reduce、map等高阶函数,部分PsychoJS运行环境对这类语法兼容性较差,使用基础循环实现的方案兼容性最强,可稳定运行。
实现代码如下:
// 初始化两个空数组存储拆分后的结果 let adult_shuffled = [] let child_shuffled = [] // 遍历打乱后的配对数组,逐对拆分元素 for (let i = 0; i < animals.length; i++) { adult_shuffled.push(animals[i][0]) child_shuffled.push(animals[i][1]) }
- 拆分完成后,
adult_shuffled和child_shuffled即为打乱后保留配对关系的两个独立列表,效果和Python unzip结果完全一致 - 如果需要处理3组及以上的关联配对列表,只需要对应初始化更多空数组,在循环中按索引位置依次追加对应元素即可
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

