任務:撰寫一個函式,接受一個陣列和一個數字 n。然后輸出一個陣列,其中沒有重復n次以上的元素。
示例:
輸入:
n = 3;
arr = [1, 2, 4, 4, 4, 2, 2, 2, 2]
輸出:
結果 = [1, 2, 4, 4, 4, 2, 2]
試圖做類似的事情,但它無法正常作業。
let arr = [1, 2, 4, 4, 4, 2, 2, 2, 2];
let new_set = [...new Set(arr)];
let result = [];
console.log(new_set); // [1, 2, 4]
first:
for (let i = 0; i < arr.length; i ) {
if (arr[i] === arr[i - 1]) {
continue first;
}
else {
let count = 0;
for (let j = i; j < arr.length; j ) {
if ((arr[i] === arr[j]) && (count < 3)) {
result.push(arr[j]);
}
}
}
}
uj5u.com熱心網友回復:
您需要一個持久的外部變數來跟蹤一個專案到目前為止被迭代了多少次。一旦超過限制,不要將正在迭代的專案推送到結果。
const arr = [1, 2, 4, 4, 4, 2, 2, 2, 2]
let n = 3;
const counts = {};
const result = [];
for (const item of arr) {
counts[item] = (counts[item] || 0) 1;
if (counts[item] <= n) {
result.push(item);
}
}
console.log(result);
uj5u.com熱心網友回復:
另一種選擇,如果你想使用Array.reduce.
它不像@CertainPerformance 那樣優化,因為它在回圈內使用過濾器。但對于像這樣的小型陣列來說,不太可能產生太大影響。
const arr = [1, 2, 4, 4, 4, 2, 2, 2, 2]
let n = 3;
const result = arr.reduce((a,v)=>(
a.filter(f=>f===v).length < n ?a.push(v):a,a),[]);
console.log(result);
uj5u.com熱心網友回復:
使用 reduce 且不使用 array.filter 撰寫高爾夫版本代碼:
const f=(n,a)=>a.reduce((({c={},r=[]},i)=>
(c[i]??=0, c[i]>n?0:r.push(i),{c,r})),{}).r;
console.log(f(3, [1, 2, 4, 4, 4, 2, 2, 2, 2]).join());
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/534332.html
標籤:javascript数组
下一篇:打字稿可選物件引數瘋狂
