3 回答
TA貢獻1856條經驗 獲得超5個贊
您應該能夠僅使用filter()、indexOf()和來實現reduce():
function filterByCount(array, count) {
return array.filter((a, index) =>
array.indexOf(a) === index &&
array.reduce((acc, b) => +(a === b) + acc, 0) === count
);
}
const arr = [1, 5, 3, 5, 1, 5, 6, 6, 6];
console.log(filterByCount(arr, 3));
請注意,這種方法效率很低。通過使用類似的類Map,您可以在 O(n) 時間內而不是 O(n 2 ) 時間內實現這一目標。
在 O(n log(n)) 時間內實現此目的的另一種不太簡單的方法是對數組進行排序,然后將每個值的第一個和最后一個索引之間的差異與預期的count. 此解決方案需要sort() 和filter()。如果您不想改變原始數組,那么slice()也需要:
function filterByCount(array, count) {
// uncomment to avoid mutating the input array
return array/*.slice()*/.sort((a, b) =>
a - b
).filter((value, index, sorted) =>
(index === 0 || sorted[index - 1] !== value) &&
index + count - 1 < sorted.length &&
sorted[index + count - 1] === value &&
(index + count >= sorted.length || sorted[index + count] !== value)
);
}
const arr = [1, 5, 3, 5, 1, 5, 6, 6, 6];
console.log(filterByCount(arr, 3));
TA貢獻1829條經驗 獲得超6個贊
不過,這只是一個想法,如果您可以對數組進行排序,則可以計算連續出現的數字。
function findRepeatingNumbers(numbers, count) {
numbers.sort((a, b) => a - b);
const found = [];
let counter = 1;
for (let i = 1; i < numbers.length; i++) {
if (numbers[i - 1] == numbers[i]) {
counter += 1;
} else {
if (counter === count) {
found.push(numbers[i - 1]);
}
counter = 1;
}
}
if (counter == count) {
found.push(numbers[numbers.length - 1]);
}
return found;
}
console.log(findRepeatingNumbers([1, 5, 3, 5, 1, 5, 6, 6, 6], 3));
TA貢獻1810條經驗 獲得超4個贊
如果你想找出在數組中出現了多少次的元素,你可以很容易地知道下面這段代碼。例如,這里的 6 是這個數組中的 3 次。
運行代碼片段檢查一下。
let arr = [1, 5, 3, 5, 1, 5, 6, 6, 6];
console.log((arr.join("").match(new RegExp("6", "g")) || []).length)
添加回答
舉報
