如何筛选数组中带尾缀x的元素并修改后续匹配项?
问题描述
给定输入数组:
const inputArr = [ ["1.3","6"], ["1.4", "7"], ["1.4", "7"], ["1.4x", "s"], ["1.4x", "g"], ["1.4x", "9"], //此处为带尾缀'x'的元素,需在后续子数组中查找"1.4" ["2","8"], ["2.1x","9"], ["2.2.2","12"], ["1.4", "13"], //找到"1.4",需改为"1.4x" ["1.4", "14"], //找到"1.4",需改为"1.4x" ["2.1","92"], ["3","15"], ["4","16"] ]
需要按照以下条件创建新数组:
- 筛选出子数组第一个元素中带尾缀
x的唯一字符串(例如"1.4x")。 - 针对每个筛选出的元素,在后续的子数组(而非前面的子数组)中查找与该元素去掉尾缀
x后匹配的字符串(例如,针对"1.4x"查找后续的"1.4")。 - 若找到匹配项,为其添加尾缀
x。
预期得到的新数组如下:
newArr = [ ["1.3","6"], ["1.4", "7"], ["1.4", "7"], ["1.4x", "s"], ["1.4x", "g"], ["1.4x", "9"], ["2","8"], ["2.1x","9"], ["2.2.2","12"], ["1.4x", "13"], //将"1.4"改为"1.4x" ["1.4x", "14"], //将"1.4"改为"1.4x" ["2.1x","92"], //将"2.1"改为"2.1x" ["3","15"], ["4","16"] ]
目前已经通过以下代码筛选出带尾缀x的唯一元素,但不清楚后续步骤如何实现:
const filteredItems = inputArr.filter(([key, value]) => key.endsWith("x")); const uniqueFilteredItems =[...new Set(filteredItems.map(([k]) => k))] console.log(uniqueFilteredItems);
解决方案
核心思路是:遍历数组时,实时记录已经出现过的带x后缀的键(去掉x后的版本),后续遇到匹配的无x键时自动添加x后缀,天然满足"只修改后续元素"的要求。
完整实现代码:
const inputArr = [ ["1.3","6"], ["1.4", "7"], ["1.4", "7"], ["1.4x", "s"], ["1.4x", "g"], ["1.4x", "9"], ["2","8"], ["2.1x","9"], ["2.2.2","12"], ["1.4", "13"], ["1.4", "14"], ["2.1","92"], ["3","15"], ["4","16"] ]; // 存储需要匹配的前缀(带x后缀的键去掉x后的值) const requiredKeys = new Set(); const newArr = []; for (const [key, value] of inputArr) { if (key.endsWith('x')) { // 提取前缀存入集合,原键值对直接加入新数组 const prefix = key.slice(0, -1); requiredKeys.add(prefix); newArr.push([key, value]); } else { // 检查当前键是否需要补x后缀 if (requiredKeys.has(key)) { newArr.push([`${key}x`, value]); } else { newArr.push([key, value]); } } } console.log(newArr);
代码说明
requiredKeys集合:用来快速判断后续的无x键是否需要补后缀,集合的查询效率比数组更高。- 遍历逻辑:
- 遇到带
x的键:先把去掉x的前缀存入集合,再将原键值对加入新数组。 - 遇到无
x的键:如果该键在集合中存在,就补x后缀后加入,否则直接加入原键值对。
- 遇到带
- 顺序保障:因为是按原数组顺序遍历,只有先出现带
x的键,后续的匹配项才会被修改,完全符合"只修改后续元素"的要求。
内容的提问来源于stack exchange,提问作者Imran Al Rashid
相关产品推荐
相关产品推荐

