如何判断JavaScript对象各模块属性并分组为empty、partial、complete?
问题:将嵌套对象模块分类为 empty/partial/complete
给定以下JavaScript对象,所有顶层模块(banking、fitment等)及其嵌套属性默认值均为null:
{ banking: { account_number: null, account_type: null, bank_name: null, debit_day: null }, fitment: { date: null, terms: null }, personal_info: { email: null, IDNumber: null, mobile: null, name: null, residential_address: null, surname: null, title: null, work_address: null, work_tel: null }, vehicle: { brand: null, colour: null, model: null, registration: null, vin: null, year: null } }
需要将每个顶层模块分为三类:
- empty:模块内所有属性值均为
null; - partial:模块内部分属性已赋值(并非全为
null); - complete:模块内所有属性均不为
null。
尝试用Underscore的_.some()方法但无法覆盖所有场景,求解决方案。
解决方案
可以通过组合Underscore的_.every()和_.some()方法精准判断每个模块的状态,核心逻辑是先排除"全空",再排除"全不为空",剩余即为"部分填充"。
Underscore实现代码
// 判断单个模块的状态 function getModuleStatus(module) { const propValues = _.values(module); // 所有属性都是null → empty if (_.every(propValues, val => val === null)) { return 'empty'; } // 所有属性都不是null → complete if (_.every(propValues, val => val !== null)) { return 'complete'; } // 其余情况 → partial return 'partial'; } // 遍历所有模块完成分类 function classifyModules(dataObj) { const result = { empty: [], partial: [], complete: [] }; _.each(dataObj, (module, moduleName) => { const status = getModuleStatus(module); result[status].push(moduleName); }); return result; } // 示例调用 const userData = { /* 你的目标对象 */ }; const classificationResult = classifyModules(userData); console.log(classificationResult);
逻辑说明
_.values(module):提取模块内所有属性值组成数组,方便批量判断;_.every(propValues, val => val === null):检查数组中所有值是否全为null,是则标记为empty;_.every(propValues, val => val !== null):检查数组中所有值是否全不为null,是则标记为complete;- 既不满足empty也不满足complete的模块,直接归为partial。
原生JS替代方案(无需Underscore)
如果不想依赖第三方库,用原生数组方法同样可以实现:
function getModuleStatus(module) { const propValues = Object.values(module); if (propValues.every(val => val === null)) return 'empty'; if (propValues.every(val => val !== null)) return 'complete'; return 'partial'; } function classifyModules(dataObj) { const result = { empty: [], partial: [], complete: [] }; Object.entries(dataObj).forEach(([moduleName, module]) => { const status = getModuleStatus(module); result[status].push(moduleName); }); return result; }
内容的提问来源于stack exchange,提问作者RookieSA
相关产品推荐
相关产品推荐

