如何筛选必要数据生成含问题与对应标签值的新数组?
问题需求
我有一个包含multiple、single、text三种类型问题的对象,结构如下:
const data = { questions: [ { "question": "Question 1", "value": [ "value_1.1.1", "value_1.1.2" ], "type": "multiple", "options": [ { "value": "value_1.1.1", "label": "Value 1.1.1" }, { "textValue":"Additional text value", "value": "value_1.1.2", "label": "Value 1.1.2" }, { "value":"value_1.1.3", "label":"Value 1.1.3", } ] }, { "question": "Question 2", "value": "value_2.1.1", "type": "single", "options": [ { "value": "value_2.1.1", "label": "Value 2.1.1" }, { "value": "value_2.1.2", "label": "Value 2.1.2" }, ] }, { "question":"Question 3", "textValue":"Test 12345", "type":"text" } ] }
需要生成一个新数组,每个元素是包含question和value键的对象,value需满足以下规则:
multiple类型:value包含多个选中选项的标签- 通过父级
value匹配选项的value,获取对应选项的label作为value的内容 - 若选中的选项包含
textValue,需将该值也加入value数组 single类型:value是包含选中选项标签的数组text类型:value是包含textValue的数组
最终期望的输出结果:
const newData = [ { question: "Question 1", value: ['Value 1.1.1', 'Value 1.1.2', 'Additional text value'] }, { question: "Question 2", value: ['Value 2.1.1'] }, { question: "Question 3", value: ['Test 12345'] } ];
解决方案
可以通过Array.map()遍历原始问题数组,针对不同类型做处理:
const newData = data.questions.map(question => { let value = []; switch(question.type) { case 'multiple': case 'single': // 统一处理单选和多选,把选中的value转成数组 const selectedValues = Array.isArray(question.value) ? question.value : [question.value]; selectedValues.forEach(val => { const option = question.options.find(opt => opt.value === val); if (option) { value.push(option.label); // 如果有textValue则追加 if (option.textValue) { value.push(option.textValue); } } }); break; case 'text': value.push(question.textValue); break; } return { question: question.question, value: value }; }); console.log(newData);
代码说明
- 使用
map()遍历每个问题,生成目标结构的对象 - 对
multiple和single类型统一处理:将选中的value转为数组,遍历每个选中值,找到对应的选项,添加label,若有textValue则一并添加 text类型直接将textValue加入数组- 最终返回包含
question和处理后value的对象
内容的提问来源于stack exchange,提问作者Can
相关产品推荐
相关产品推荐

