JavaScript:实现字典键存储多位置值并按字母序排序键
解决字母出现位置记录与字典键排序问题
嘿,作为JS新手遇到这个问题很正常,我帮你拆解下问题所在,一步步解决它~
一、修复字母位置记录的问题
你的代码里有两个关键问题导致只保留了最后一个位置:
- 条件判断的逻辑错误:
!stringArgument[i] in dict的写法有问题,因为逻辑非!的优先级比in高,实际执行的是!(stringArgument[i]) in dict,这完全不是你想要的判断(判断当前字母是否不在字典里)。正确的写法应该是!(stringArgument[i] in dict),或者更直观的dict[stringArgument[i]] === undefined。 - 数组赋值错误:else分支里你直接把
dict[stringArgument[i]]赋值为[i+1],这会覆盖之前已经存储的数组,正确的做法是用push()方法把新的位置添加到已有的数组里。
修正后的代码如下:
function letters(stringArgument) { stringArgument = stringArgument.replace(/ /g,''); var dict = {}; for (var i=0; i < stringArgument.length; i++ ) { var char = stringArgument[i]; // 判断当前字符是否未在字典中 if (!(char in dict)){ dict[char] = [i+1]; // 初始化一个包含当前位置的数组 } else { dict[char].push(i+1); // 把新位置添加到数组末尾 } } return dict; } var a = letters('Lost time is never found again.'); console.log(a);
现在执行这段代码,就能得到每个字母的所有出现位置了,比如o会变成[2, 17],完全符合你的预期。
二、将字典的按键按字母顺序排序
JavaScript对象的键在ES6及以后版本有一定的顺序,但如果要明确按字母(默认大写字母排在小写前面)排序,我们可以先提取所有键,排序后再生成一个新的有序对象:
方法1:生成排序后的新对象
function getSortedDict(originalDict) { // 提取键并排序,localeCompare可以处理多语言字母排序 const sortedKeys = Object.keys(originalDict).sort((a, b) => a.localeCompare(b)); const sortedDict = {}; sortedKeys.forEach(key => { sortedDict[key] = originalDict[key]; }); return sortedDict; } // 使用示例 var result = letters('Lost time is never found again.'); var sortedResult = getSortedDict(result); console.log(sortedResult);
如果想要忽略大小写排序(比如把L和a按字母顺序混排),可以修改sort的回调:
const sortedKeys = Object.keys(originalDict).sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));
方法2:直接输出排序后的键值对(如果不需要对象格式)
如果你只是想按顺序查看结果,也可以直接遍历排序后的键:
Object.keys(result).sort((a,b) => a.localeCompare(b)).forEach(key => { console.log(`${key}: ${result[key]}`); });
内容的提问来源于stack exchange,提问作者arty
相关产品推荐
相关产品推荐

