说明
Given an array, print out all of the duplicates within that array.
let arr = [1, 2, 2, 3, 3, 4, 5, 5, 8, 8, 9, 10];
const result = arr.filter(x => arr.filter(y => y === x).length > 1);
console.log(result);
// 2, 2, 3, 3, 5, 5, 8, 8
所以,有人请提供这个答案,据我所知,但我正在寻找使用for循环的替代解决方案。
我想到了这个,但这只会返回
2, 3, 5, 8
而不是我需要的上述结果。
const result2 = () => {
let newArray = [];
for(let i = 0; i < arr.length; i++) {
if(arr[i] === arr[i + 1]) {
newArray.push(arr[i])
}
}
return newArray
}
console.log(result2(arr));
// 2, 3, 5, 8
我想念什么?我需要它打印出所有重复项,而不仅仅是告诉我哪些重复项。
答案 0 :(得分:2)
let arr = [1, 2, 2, 3, 3, 4, 5, 5, 8, 8, 9, 10];
var mem = {};
var finalArr = [];
for(var i = 0, j = arr.length; i< j; i++) {
if(!mem.hasOwnProperty(arr[i])){
mem[arr[i]] = [];
}
mem[arr[i]].push(arr[i]);
}
for(var i in mem) {
if(mem.hasOwnProperty(i) && mem[i].length > 1) {
finalArr = [...finalArr, ...mem[i]]
}
}
console.log(finalArr);
希望这对您有帮助!
答案 1 :(得分:1)
您当前的
if(arr[i] === arr[i + 1]) {
不会检查前一个元素是否相同(并且即使更改为|| arr[i] === arr[i - 1]
,也只能在排序数组上使用,但不能保证是这样)。
let arr = [1, 2, 2, 3, 3, 4, 5, 5, 8, 8, 9, 10];
const result2 = () => {
let newArray = [];
for (let i = 0; i < arr.length; i++) {
if (arr[i] === arr[i + 1] || arr[i] == arr[i - 1]) {
newArray.push(arr[i]);
}
}
return newArray;
}
console.log(result2(arr));
要模拟现有的嵌套.filter
,您需要找出数组中有多少个匹配元素-再次遍历数组并检查有多少个匹配项:
let arr = [1, 2, 2, 3, 3, 4, 5, 5, 8, 8, 9, 10];
const result2 = () => {
let newArray = [];
for (let i = 0; i < arr.length; i++) {
let count = 0;
for (let j = 0; j < arr.length; j++) {
if (arr[i] === arr[j]) {
count++;
}
}
if (count >= 2) {
newArray.push(arr[i])
}
}
return newArray
}
console.log(result2(arr));
但这具有很差的计算复杂度(O(N^2)
)。我希望计算出每个元素提前出现的次数(O(N)
):
let arr = [1, 2, 2, 3, 3, 4, 5, 5, 8, 8, 9, 10];
const result2 = () => {
const countsByNum = arr.reduce((a, num) => {
a[num] = (a[num] || 0) + 1;
return a;
}, {});
let newArray = [];
for (let i = 0; i < arr.length; i++) {
if (countsByNum[arr[i]] >= 2) {
newArray.push(arr[i]);
}
}
return newArray
}
console.log(result2(arr));
答案 2 :(得分:1)
通过过滤排序的数组
cancel