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

如何将数组中OR节点作为顶层,嵌套相邻OR节点间的AND节点?

重组组合器数组结构的实现方案

嘿,这个需求其实很好搞定——本质就是把两个OR之间的所有AND都打包进前一个OR的subarray里对吧?我给你捋个清晰的实现思路,再附上可直接运行的代码:

核心思路

我们只需要遍历原数组,同时维护两个关键变量:一个用来存最终结果的数组,还有一个“当前活跃的OR节点”——也就是正在收集后续AND的那个OR对象。具体步骤是:

  • 碰到OR的时候,新建一个带空subarray的OR对象,把它放进结果数组,然后把它设为当前要收集AND的目标
  • 碰到AND的时候,直接把它塞进当前活跃OR的subarray里就行

JavaScript代码实现

const originalArray = [
  { "combinator": "OR" },
  { "combinator": "AND" },
  { "combinator": "AND" },
  { "combinator": "OR" },
  { "combinator": "AND" },
  { "combinator": "AND" }
];

const restructureCombinators = (arr) => {
  const finalResult = [];
  let currentTargetOR;

  for (const item of arr) {
    if (item.combinator === 'OR') {
      // 新建OR节点,浅拷贝原对象并添加subarray属性
      currentTargetOR = { ...item, subarray: [] };
      finalResult.push(currentTargetOR);
    } else if (item.combinator === 'AND' && currentTargetOR) {
      // 确保有活跃的OR节点时,才添加AND进去
      currentTargetOR.subarray.push({ ...item });
    }
  }

  return finalResult;
};

// 调用函数得到结果
const restructuredArray = restructureCombinators(originalArray);
console.log(restructuredArray);

代码细节说明

  • 用{ ...item }浅拷贝原对象,这样不会修改原数组里的元素引用,避免意外副作用
  • 加了currentTargetOR的存在判断,如果原数组开头是AND,这些AND会被忽略(你要是需要处理这种边界情况,可以加个判断抛出错误或者做其他自定义处理)
  • 遍历完成后,finalResult就是你想要的目标结构

运行结果

执行这段代码后,会输出你预期的结构:

[
  { "combinator": "OR", "subarray": [ { "combinator": "AND" }, { "combinator": "AND" } ] },
  { "combinator": "OR", "subarray": [ { "combinator": "AND" }, { "combinator": "AND" } ] }
]

内容的提问来源于stack exchange,提问作者Goran Tesic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 10:17:42