如何使用jQuery筛选非空数组并通过extend进行合并?
我来帮你搞定这个问题!你现在的需求是合并多个对象,但要自动剔除那些值为空数组的属性,对吧?核心思路就是在合并前先过滤掉每个对象里的空数组项,这样最终的JSON就不会出现那些没用的空数组键了。
解决方案步骤
- 写一个过滤函数:遍历对象的所有属性,只保留非空数组(或非数组类型)的属性,移除值为空数组的属性。
- 用这个函数处理你要合并的每个对象(
personarray、providerarray、researcherarray)。 - 再用
$.extend合并处理后的对象,最后转成JSON字符串。
完整代码示例
首先定义过滤函数(两种写法,选你习惯的就行):
写法一:传统for循环(兼容旧环境)
function filterEmptyArrays(obj) { const filteredObj = {}; for (const key in obj) { if (obj.hasOwnProperty(key)) { const value = obj[key]; // 只有当值是数组且长度为0时才跳过,其他情况都保留 if (!(Array.isArray(value) && value.length === 0)) { filteredObj[key] = value; } } } return filteredObj; }
写法二:ES6+简洁版
function filterEmptyArrays(obj) { return Object.entries(obj).reduce((acc, [key, value]) => { if (!(Array.isArray(value) && value.length === 0)) { acc[key] = value; } return acc; }, {}); }
然后修改你的业务代码:
// 你的原有赋值逻辑不变 personarray['Person'] = person; providerarray['Provider'] = provider; researcherarray['Researcher'] = researcher; // 1. 过滤每个对象中的空数组属性 const processedPerson = filterEmptyArrays(personarray); const processedProvider = filterEmptyArrays(providerarray); const processedResearcher = filterEmptyArrays(researcherarray); // 2. 深拷贝合并过滤后的对象(第一个{}用来创建新对象,避免修改原数据) const mergedResult = $.extend(true, {}, processedPerson, processedProvider, processedResearcher); // 3. 转成JSON字符串 const dataStr = JSON.stringify(mergedResult);
如果要合并的对象很多,还可以用更简洁的批量处理方式:
// 把所有要合并的对象放进数组 const allObjects = [personarray, providerarray, researcherarray]; // 批量过滤 + 合并 const mergedResult = allObjects .map(obj => filterEmptyArrays(obj)) .reduce((acc, currentObj) => $.extend(true, acc, currentObj), {}); const dataStr = JSON.stringify(mergedResult);
效果验证
当person是空数组时,processedPerson里会自动移除Person这个键,合并后的结果就不会出现"Person":[],正好符合你期望的输出:
{"Profile Id":1234,"Provider":[{"table name":"Provider","unique id":"0","field name":"ProSalary","field value":"$320,800"}],"Researcher":[{"table name":"Researcher","unique id":"0","field name":"ProSalary","field value":"$320,800"}]}
内容的提问来源于stack exchange,提问作者An User
相关产品推荐
相关产品推荐

