如何从数组动态为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);
方案优势
- 高效简洁:仅需一次遍历,通过引用追踪嵌套层级,时间复杂度为O(n)(n为条件数组长度)
- 支持任意多层嵌套:无论条件数组有多少元素,都能正确实现层层嵌套的要求
- 类型安全:通过明确的类型定义,避免了
any类型带来的潜在错误 - 无副作用:复制初始对象进行修改,不会影响原数据的完整性
输出结果
运行上述代码后,finalData将完全符合API要求的格式:
{ field: "category", value: "order", AND: { field: "circuit", value: "ninth", OR: { field: "second", value: "abc" } } }
内容的提问来源于stack exchange,提问作者Atin Singh
相关产品推荐
相关产品推荐

