咨询:按特定规则将数组转换为对象的实现方法
如何实现将以'and'/'or'开头的数组转换为嵌套对象?
需求描述
需要编写一个函数,将以'and'或'or'开头的数组转换为嵌套对象:处理当前层级的后续元素,直到遇到下一个'and'或'or'时进行嵌套处理。示例如下:
输入数组:
[ 'and', 1, 2, 'or', 3, 4, ]
转换后输出:
{ and: [ 1, 2, { or: [ 3, 4 ] } ] }
实现思路
- 迭代+递归结合的层级处理:利用递归处理嵌套结构,每次遇到
and/or就开启一个新的层级,当前层级的数组收集普通元素,直到遇到下一个逻辑运算符或数组末尾。 - 指针追踪遍历位置:用闭包内的指针记录当前遍历到的数组索引,处理嵌套时直接跳转到对应位置,避免重复遍历元素。
- 动态构建对象:每个层级都基于当前运算符创建新对象,其值为数组,用来存放当前层级的元素(普通值或嵌套对象)。
代码实现示例
function transformLogicArray(arr) { let idx = 0; // 递归处理每个层级的逻辑块 function buildLevel() { if (idx >= arr.length) return null; // 取出当前层级的运算符(and/or) const operator = arr[idx++]; const levelObj = { [operator]: [] }; // 遍历后续元素,直到数组结束或遇到新的运算符 while (idx < arr.length) { const current = arr[idx]; if (current === 'and' || current === 'or') { // 遇到新运算符,递归构建嵌套层级 levelObj[operator].push(buildLevel()); } else { // 普通元素直接加入当前层级数组 levelObj[operator].push(arr[idx++]); } } return levelObj; } return buildLevel(); } // 测试用例 const inputArr = ['and', 1, 2, 'or', 3, 4]; console.log(transformLogicArray(inputArr));
代码说明
- 闭包内的
idx指针负责跟踪数组遍历位置,确保嵌套处理时不会重复读取元素。 buildLevel函数负责构建单个层级的对象:先读取当前运算符,然后遍历后续元素,普通值直接加入数组,遇到新运算符则递归生成嵌套对象。- 整个逻辑从数组第一个元素开始,自然处理所有嵌套层级,直到数组遍历完成。
内容的提问来源于stack exchange,提问作者Farooq Alaulddin
相关产品推荐
相关产品推荐

