从另一数组提取重复值数组失败,代码为何无法运行?
解决数组提取唯一重复值的问题(禁用数组方法)
嘿,我明白你的需求了——要从给定数组里把所有重复出现过的值挑出来组成新数组,而且每个重复值在新数组里只出现一次,还不能用任何数组函数或方法对吧?我来帮你补全代码并解释思路。
首先,核心思路分两步:
- 先统计原数组中每个元素的出现次数
- 再筛选出出现次数大于1的元素,确保它们在结果数组里只出现一次
因为不能用数组方法,所以我们用原生的for循环和一个对象来做计数(对象的键天然具备唯一性,刚好适合统计)。下面是完整的实现代码:
var numbers = [8,24,20,5,13,3,1,12,11,24,8,24,20,4,5,23,24,23,21,2,19,3,21,2,14,17,21,5,7,10,20,11,0,5,18,2,13,11,14,3,20,1,23,6,21,10,14,0,15,20]; var results = []; var tempCount = {}; // 用来记录每个数字的出现次数,替换你写的tempA // 第一步:遍历原数组,统计每个数字的出现次数 for (var i = 0; i < numbers.length; i++) { var currentNum = numbers[i]; // 如果数字已经被统计过,计数+1;否则初始化为1 if (tempCount[currentNum]) { tempCount[currentNum]++; } else { tempCount[currentNum] = 1; } } // 第二步:筛选重复值,加入结果数组(完全不用数组方法) for (var key in tempCount) { var num = Number(key); // 将对象的字符串键转回数字 // 只保留出现次数>1的数字 if (tempCount[key] > 1) { // 不用push方法,直接通过索引赋值添加元素 results[results.length] = num; } } // 测试输出结果 console.log(results); // 输出:[8,24,20,5,13,3,11,23,21,2,14,0,10]
关键细节说明:
- 计数对象
tempCount:利用对象键的唯一性,我们可以快速记录每个元素的出现次数,避免重复统计。 - 不用数组方法添加元素:因为
push是数组方法,所以我们用results[results.length] = num——数组的length属性是可直接访问的,通过给当前长度对应的索引赋值,就能在数组末尾添加新元素,完全符合你的限制条件。 - 去重保证:因为计数对象的每个键都是唯一的,所以遍历它的时候,每个重复值只会被添加到结果数组一次,自然实现了结果数组的去重。
内容的提问来源于stack exchange,提问作者Brian Hernandez
相关产品推荐
相关产品推荐

