本文介绍如何使用 javascript 的 split、filter 和 map 方法,将两个以序号分隔的问答字符串(如 "1.what is love? 2.1+1 = ?" 和 "1.yes 2.2")精准拆解并配对,最终生成形如 [{ "what is love?": "yes" }, { "1+1 = ?": "2" }] 的结构化数组。
本文介绍如何使用 javascript 的 split、filter 和 map 方法,将两个以序号分隔的问答字符串(如 "1.what is love? 2.1+1 = ?" 和 "1.yes 2.2")精准拆解并配对,最终生成形如 [{ "what is love?": "yes" }, { "1+1 = ?": "2" }] 的结构化数组。
要实现从原始字符串到结构化问答对象数组的转换,核心在于剥离序号、对齐问题与答案、构建键值对。由于输入字符串中问题和答案均以 数字.(如 "1.", "2.")为分隔标记,我们可借助正则表达式 /\d+\./g 进行分割——该模式匹配一个或多个数字后紧跟英文句点,全局匹配所有序号标记。
但直接 split 会产生首项空字符串(因字符串以 "1." 开头),且可能残留空白项。因此需配合 filter(Boolean) 去除空值,并用 map(s => s.trim()) 清理首尾空格,确保每个问题/答案内容干净可用。
以下是完整、健壮的实现代码:
const questions = "1.What is love? 2.1+1 = ? 3. 2+2 = ?";
const answers = "1.Yes 2.2 3.4";
function splitByNumberedPrefix(str) {
return str.split(/d+./g)
.filter(Boolean) // 移除空字符串
.map(s => s.trim()); // 去除首尾空格
}
const quesList = splitByNumberedPrefix(questions);
const ansList = splitByNumberedPrefix(answers);
// 确保问题与答案数量一致,避免索引越界
if (quesList.length !== ansList.length) {
throw new Error(`Mismatched question and answer count: ${quesList.length} vs ${ansList.length}`);
}
const package = quesList.map((q, i) => ({ [q]: ansList[i] }));
console.log(package);
// 输出:
// [
// { "What is love?": "Yes" },
// { "1+1 = ?": "2" },
// { "2+2 = ?": "4" }
// ]⚠️ 注意事项:
- 该方案假设问题与答案的序号严格一一对应(即 "1." 对 "1."、"2." 对 "2."),不校验序号数值是否连续或顺序是否一致;若输入存在乱序(如 "3.Answer" "1.Question"),结果将错位。如需强一致性校验,建议先提取序号+内容元组再按序号排序。
- 正则 /\d+\./g 可匹配 "100." 等多位序号,具备扩展性;但若字符串中问题本身含类似 "Q1. What?" 或答案含 "See 2. above",可能误切——此时应改用更精确的边界匹配(如 /(?
- 最终生成的对象键为问题文本(不含序号),语义清晰,便于后续遍历或渲染(例如在 React 中 Object.keys(item)[0] 获取问题,Object.values(item)[0] 获取答案)。
通过函数式链式操作,整个流程简洁、可读性强,是处理此类规整编号字符串的理想范式。

















