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

TypeScript中强类型实现嵌套对象特定key的唯一值获取

强类型实现嵌套规则集的唯一字段提取

需求说明

从n层级嵌套的ruleset对象中提取所有field键的唯一值,预期输出为['TierLevel', 'CompanyType', 'CompanyService', 'City', 'StateProvince', 'Country']。现有实现使用any类型,不符合TypeScript强类型要求,需重构为类型安全的方案。

强类型实现方案

首先定义递归类型约束规则集结构,确保类型安全:

// 基础规则(叶子节点:包含field的具体规则)
type BaseRule<T extends string = string> = {
  field: T;
  operator: string;
  value: string | number;
};

// 嵌套规则集(分支节点:包含condition和子规则列表)
type RuleSet<T extends string = string> = {
  condition: 'and' | 'or';
  rules: Array<BaseRule<T> | RuleSet<T>>;
};

然后实现纯递归函数,无副作用地收集并去重字段:

function extractUniqueFields<T extends string>(ruleset: RuleSet<T>): T[] {
  // 内部递归收集字段的函数
  const collectFields = (node: BaseRule<T> | RuleSet<T>): T[] => {
    // 判断当前节点是规则集还是基础规则
    if ('rules' in node) {
      // 递归遍历所有子规则,合并结果
      return node.rules.flatMap(collectFields);
    } else {
      // 返回当前基础规则的field
      return [node.field];
    }
  };

  // 收集所有字段后通过Set去重,再转回数组
  const allFields = collectFields(ruleset);
  return [...new Set(allFields)];
}

使用示例

将示例规则集传入函数,即可得到预期的唯一字段列表:

const ruleset = {
  condition: 'and',
  rules: [
    { field: 'TierLevel', operator: 'Equals', value: '1' },
    { field: 'CompanyType', operator: 'Equals', value: '7' },
    { field: 'CompanyService', operator: 'Equals', value: '23' },
    {
      condition: 'or',
      rules: [
        { field: 'City', operator: 'Contains', value: 'york' },
        { field: 'City', operator: 'Contains', value: 'cal' }
      ]
    },
    {
      condition: 'or',
      rules: [
        { field: 'StateProvince', operator: 'Equals', value: '3171' },
        { field: 'StateProvince', operator: 'Equals', value: '475' },
        {
          condition: 'or',
          rules: [
            { field: 'Country', operator: 'Equals', value: '224' },
            { field: 'Country', operator: 'Equals', value: '1' }
          ]
        }
      ]
    }
  ]
};

const uniqueFields = extractUniqueFields(ruleset);
console.log(uniqueFields);
// 输出: ['TierLevel', 'CompanyType', 'CompanyService', 'City', 'StateProvince', 'Country']

方案优势

  • 强类型约束:通过递归类型RuleSet和BaseRule避免any类型,编译阶段即可检测结构错误
  • 纯函数设计:无外部副作用,逻辑清晰,易于测试和维护
  • 自动类型推断:传入规则集时,函数会自动推断field的联合类型,返回值类型精准

内容的提问来源于stack exchange,提问作者Shashikumar N

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 14:04:56