如何将数组中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
相关产品推荐
相关产品推荐

