JavaScript实现将对象数组属性拼接为指定格式过滤条件字符串
原代码问题清单
- 拼写错误:数组处理分支中
prevFilter = this.filterConditon存在拼写错误,应为this.filterConditionString,直接导致变量赋值失效 - 数组遍历取值错误:遍历数组类型的value时,模板字符串错误引用了整个数组
filter.value,而非当前遍历项arrVal,会生成类似filter2 == 112,113的错误内容 - 分隔符处理逻辑冗余:每个条件拼接时都额外追加分隔符,后续还要裁剪多余字符,逻辑复杂容易出错
- 遍历方法误用:
map方法用于生成新数组,仅做遍历拼接逻辑应该用forEach更合适 - 变量冗余:
prevFilter、prevArrayFilter这类中间变量完全多余,反而提升逻辑复杂度
修复后的实现代码
var filterConditionString = ""; var filterConditionsList = [ { apiDataProperty: "LevelId", filterQueryParamName: "entityLevelId", value: 909 }, { apiDataProperty: "TypeId", filterQueryParamName: "entityTypeId", value: 910 }, { apiDataProperty: "WORKFORCE", filterQueryParamName: "filter1", value: 11 }, { apiDataProperty: "MAIN_INSTRUMENT", filterQueryParamName: "filter2", value: [112, 113] }, { apiDataProperty: "MATRIX_ENTITY", filterQueryParamName: "filter3", value: [1131, 213, 413] }, { apiDataProperty: "VERSIONID", filterQueryParamName: "filter4", value: 1141 } ]; createFilterConditions(filterConditionsList); console.log(filterConditionString); function createFilterConditions(filterList) { // 先收集每个过滤项对应的条件片段 const conditionSegments = []; filterList.forEach(filter => { if (!filter.value) return; const paramName = filter.filterQueryParamName; // 非数组类型直接生成单条条件 if (!Array.isArray(filter.value)) { conditionSegments.push(`${paramName} == ${filter.value}`); return; } // 数组类型生成括号包裹的或条件 const orSegments = filter.value.map(val => `${paramName} == ${val}`); conditionSegments.push(`( ${orSegments.join(' || ')} )`); }); // 所有片段用&&拼接得到最终结果 this.filterConditionString = conditionSegments.join(' && '); }
输出结果
生成的filterConditionString为:
entityLevelId == 909 && entityTypeId == 910 && filter1 == 11 && ( filter2 == 112 || filter2 == 113 ) && ( filter3 == 1131 || filter3 == 213 || filter3 == 413 ) && filter4 == 1141
注:你期望结果里的entityLeveId为拼写错误,少了字符l,上述输出为符合字段定义的正确结果
内容的提问来源于stack exchange,提问作者Michael Bardos
相关产品推荐
相关产品推荐

