本文介绍三种 JavaScript 代码简化技巧:利用 Set 或 filter 高效去除数组重复项;通过 Math.max/min 计算连续整数序列中缺失数字的个数;以及使用展开运算符和 reverse 方法简洁判断字符串是否为回文。旨在帮助开发者编写更简洁、易读的代码。
数组去重的三种实现方式
我们从如何删除数组中的重复项这一基础问题开始探讨。
复杂方案:使用 forEach 删除重复项
该方法首先创建一个空数组,然后利用 forEach 遍历原数组的每个元素。在遍历过程中,检查新数组中是否已存在该值,若不存在则将其添加进去。
function removeDuplicates(arr) {
const uniqueVals = [];
arr.forEach((value,index) => {
if(uniqueVals.indexOf(value) === -1) {
uniqueVals.push(value);
}
});
return uniqueVals;
}
简化方案:使用 filter 删除重复项
利用 filter 方法生成一个包含所有元素的新数组,并通过提供的函数进行筛选。核心逻辑是遍历数组,判断当前元素首次出现的位置索引是否与当前遍历到的索引一致。对于重复元素,这两个索引必然不同,从而被过滤掉。
function removeDuplicates(arr) {
return arr.filter((item, pos) => arr.indexOf(item) === pos)
}
简化方案:使用 Set 删除重复项
ES6 引入了 Set 数据结构,使去重操作更加便捷。Set 特性决定了它只允许存储唯一值,因此直接将数组传入 Set 构造函数即可自动去除重复值。既然 Set 能直接提供唯一元素集合,为何不直接使用它呢?
function removeDuplicates(arr) {
return [...new Set(arr)];
}
查找连续整数序列中的缺失数字
接下来解决第二个问题:编写一个函数,接收一组互不相同的非负整数,要求使这些数值连续,并返回缺失数字的数量。
例如,对于 const arr = [4,2,6,8],期望的输出结果应为
countMissingNumbers(arr)= 3
可以看出,数值 3、5 和 7 是缺失的。
复杂方案:使用 sort 和 for 循环解决
为了获取最小和最大数值,我们需要先使用 sort 方法按升序对数组进行排序。随后,从最小值循环遍历至最大值,每次检查当前序号是否存在于数组中,若不存在则将计数器加一。
function countMissingNumbers(arr) {
arr.sort((a,b) => a-b);
let count = 0;
const min = arr[0];
const max = arr[arr.length-1];
for (i = min; i<max; i++) {
if (arr.indexOf(i) === -1) {
count++;
}
}
return count;
}
简化方案:使用 Math.max 和 Math.min 求解
该方案的逻辑非常直观:Math.max() 函数用于返回数组中的最大数值,而 Math.min() 则返回最小数值。
如果数组中没有缺失数字,我们可以通过公式 maxNumber - minNumber + 1 计算出理论上应有的数字总数。用这个理论总数减去数组的实际长度,所得差值即为缺失数字的个数。
function countMissingNumbers(arr) {
return Math.max(...arr) - Math.min(...arr) + 1 - arr.length;
}
回文字符串的检测技巧
最后一个问题是检测字符串是否为回文。回文是指正读和反读都相同的字符串。
复杂方案:使用 for 循环检查
此方法从字符串的第一个字符开始循环,直至字符串长度的一半。字符串最后一个字符的索引为 string.length-1,倒数第二个为 string.length-2,依此类推。代码逻辑是检查左侧指定索引处的字符是否等于右侧对应索引处的字符,若不相等则返回 false。
function checkPalindrome(inputString) {
let length = inputString.length
for (let i =0; i<length / 2; i++) {
if (inputString[i] !== inputString[length - 1 -i]) {
return false
}
}
return true
}
简化方案:用 reverse 和 join 检查
这个解决方案简单直观,代码本身即说明了逻辑。我们只需使用展开运算符将字符串转换为数组,接着调用 reverse 方法反转数组,最后使用 join 方法将其重新拼接为字符串,并与原始字符串进行比较即可。
function checkPalindrome(string) {
return string === [...string].reverse().join('');
}
保持简单!
既然存在更简单的实现方式,何必将问题复杂化?希望本文能为你提供有价值的思路。祝你编码愉快,同时也建议在生活中尽量保持简单。
以上介绍了如何使 JavaScript 代码更简单易读的详解内容,希望对大家有所帮助。如有疑问欢迎留言,小编会及时回复。感谢大家对本站的支持!