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

如何从数组动态为API请求对象嵌套添加条件?

如何最优地将条件数组嵌套到API请求对象中?

问题背景

我们需要构造一个符合API要求的嵌套条件对象:

  • 初始请求对象:
var data = { field : "category", value : "order" }
  • API要求的嵌套格式示例:
var data ={
 field : "category",
 value : "order",
 AND : {
  field : "circuit",
  value : "ninth",
  OR : {
   field : "second",
   value : "abc"
   //可添加更多条件
  }
 }
}
  • 待添加的条件数组(每个条件需要层层嵌套进前一个条件):
const conditionsArray = [
 {filter: "AND", field: "circuit", value: "ninth"},
 {filter: "OR", field: "second", value: "abc"}
]

之前尝试的方案存在逻辑冗余、无法支持多层嵌套、类型不安全等问题:

const check = () => {
 console.log(conditionsArray);
 const data: any = { ...fieldValue };
 conditionsArray.forEach((condition: any) => {
  const { filter, name, value } = condition;
  const { AND, OR, NOT } = data;
  if (AND || OR || NOT) {
   if (AND) {
    data["AND"][filter] = { name, value };
   }
   if (OR) {
    data["OR"][filter] = { name, value };
   }
   if (NOT) {
    data["NOT"][filter] = { name, value };
   }
  } else {
   data[filter] = { name, value };
  }
 });
 console.log(data,"log data");
};

最优实现方案

我们可以通过追踪当前嵌套层级的对象引用来实现高效的层层嵌套,无需冗余的条件判断,代码如下:

// 定义明确的类型,保证类型安全
type ConditionFilter = 'AND' | 'OR' | 'NOT';
type BaseData = { field: string; value: string };
type ConditionItem = { filter: ConditionFilter } & BaseData;

const buildNestedConditions = (initialData: BaseData, conditions: ConditionItem[]) => {
  // 复制初始对象,避免修改原数据
  const result = { ...initialData };
  // 用变量追踪当前要添加条件的目标对象
  let currentTarget = result;

  for (const condition of conditions) {
    const { filter, field, value } = condition;
    // 创建当前条件的基础对象
    const conditionObj = { field, value };
    // 将条件对象挂载到当前目标的对应filter字段下
    currentTarget[filter] = conditionObj;
    // 更新目标为刚创建的条件对象,下一个条件将嵌套进这里
    currentTarget = conditionObj;
  }

  return result;
};

// 使用示例
const fieldValue = { field: "category", value: "order" };
const conditionsArray = [
 {filter: "AND", field: "circuit", value: "ninth"},
 {filter: "OR", field: "second", value: "abc"}
];

const finalData = buildNestedConditions(fieldValue, conditionsArray);
console.log(finalData);

方案优势

  1. 高效简洁:仅需一次遍历,通过引用追踪嵌套层级,时间复杂度为O(n)(n为条件数组长度)
  2. 支持任意多层嵌套:无论条件数组有多少元素,都能正确实现层层嵌套的要求
  3. 类型安全:通过明确的类型定义,避免了any类型带来的潜在错误
  4. 无副作用:复制初始对象进行修改,不会影响原数据的完整性

输出结果

运行上述代码后,finalData将完全符合API要求的格式:

{
  field: "category",
  value: "order",
  AND: {
    field: "circuit",
    value: "ninth",
    OR: {
      field: "second",
      value: "abc"
    }
  }
}

内容的提问来源于stack exchange,提问作者Atin Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:57:38