如何从对象中提取值并按规则生成指定格式的字符串数组
修改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); };
代码说明
- processItem辅助函数:
- 数组类型:直接用
join(' - ')拼接所有元素 - 对象类型(非数组、非null):提取对象所有值,递归处理每个子值后拼接
- 基础类型:直接返回原值
- 数组类型:直接用
- 主逻辑:提取原始对象的所有值,对每个值调用
processItem处理,最终返回处理后的数组
测试验证
用示例数据测试:
console.log(getValues(data)); // 输出:["17 - 66", "male - female", "true", "true", "true", "true"]
其他场景验证:
- 测试数据1:
const data1 = {"disease":{"valid":["MDD","PTSD"],"invalid":["None"]}}; console.log(getValues(data1)); // 输出:["MDD - PTSD", "None"]
- 测试数据2:
const data2 = {ageGroup: ["1","2","3","4"]}; console.log(getValues(data2)); // 输出:["1 - 2 - 3 - 4"]
- 测试数据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
相关产品推荐
相关产品推荐

