You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询:按特定规则将数组转换为对象的实现方法

如何实现将以'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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 17:22:33