使用说明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
我想念什么?我需要它打印出所有重复项,而不仅仅是告诉我哪些重复项。
最佳答案
您当前的
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));