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

如何从对象中提取值并按规则生成指定格式的字符串数组

修改JavaScript递归函数以提取符合规则的对象值数组

问题描述

需要编写函数从对象中提取值,生成满足以下规则的字符串数组:

  • 嵌套对象的所有值用-拼接成单个字符串
  • 数组的所有元素用-拼接成单个字符串
  • 非对象/数组的单个值直接保留

当前实现的递归函数会将所有嵌套值拆分为单独的数组元素,不符合需求。

示例数据与当前输出

原始数据:

const data = {
      age: {
        min: '17',
        max: '66'
      },
      gender: ['male', 'female'],
      rosacea: 'true',
      rosacea_papulo_pustulosa: 'true',
      severe_rosacea: 'true',
      nurse_contact: 'true',
    };

当前函数输出:

[
  "17",
  "66",
  "male",
  "female",
  "true",
  "true",
  "true",
  "true"
]

期望输出

[
  "17 - 66",
  "male - female",
  "true",
  "true",
  "true",
  "true"
]

其他测试场景

  • 测试数据1:{"disease":{"valid":["MDD","PTSD"],"invalid":["None"]}}
    期望输出:["MDD - PTSD", "None"]
  • 测试数据2:{ageGroup: ["1","2","3", ..., "n"]}
    期望输出:["1 - 2 - 3 ... etc ..."]
  • 测试数据3(两层嵌套对象):
{
  age: {
    group1: {
      min: '1',
      max: '6'
    },
    group2: {
      min: '7',
      max: '10'
    }    
  }
}

期望输出:['1 - 6', '7 - 10']

解决方案

修改递归逻辑,新增辅助函数处理单个元素的拼接规则,最终遍历对象值生成目标数组:

const getValues = (data) => {
  const processItem = (item) => {
    if (Array.isArray(item)) {
      return item.join(' - ');
    } else if (typeof item === 'object' && item !== null) {
      return Object.values(item).map(processItem).join(' - ');
    }
    return item;
  };

  return Object.values(data).map(processItem);
};

代码说明

  1. processItem辅助函数:
    • 数组类型:直接用join(' - ')拼接所有元素
    • 对象类型(非数组、非null):提取对象所有值,递归处理每个子值后拼接
    • 基础类型:直接返回原值
  2. 主逻辑:提取原始对象的所有值,对每个值调用processItem处理,最终返回处理后的数组

测试验证

用示例数据测试:

console.log(getValues(data));
// 输出:["17 - 66", "male - female", "true", "true", "true", "true"]

其他场景验证:

  1. 测试数据1:
const data1 = {"disease":{"valid":["MDD","PTSD"],"invalid":["None"]}};
console.log(getValues(data1));
// 输出:["MDD - PTSD", "None"]
  1. 测试数据2:
const data2 = {ageGroup: ["1","2","3","4"]};
console.log(getValues(data2));
// 输出:["1 - 2 - 3 - 4"]
  1. 测试数据3:
const data3 = {
  age: {
    group1: { min: '1', max: '6' },
    group2: { min: '7', max: '10' }    
  }
};
console.log(getValues(data3));
// 输出:["1 - 6", "7 - 10"]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:51:32