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

如何判断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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:36:25