在过去的几个小时里,我一直试图解决CodeWars的挑战之一 - 但没有任何运气 - 所以这就是任务 -
https://www.codewars.com/kata/554ca54ffa7d91b236000023/train/javascript - 指向任务的链接
任务
给定列表lst和数字N,创建一个新列表,其中包含最多n次的每个lst数而不重新排序。例如,如果N = 2,输入为[1,2,3,1,2,1,2,3],则取[1,2,3,1,2],然后放下[1,2,3,1,2] ]因为这会导致1和2在结果中3次,然后取3,这导致[1,2,3,1,2,3]。
这就是一个例子 -
实施例
deleteNth([1,1,1,1],2)// return [1,1]
deleteNth([20,37,20,21],1)// return [20,37,21]
function deleteNth(arr,x){
for (var i = 0; i<arr.length; i++){
for(var j = i+1; j<arr.length; j++){
var crr = 1;
if(arr[i]===arr[j])
crr =+ 1;
while(crr>=x){
arr.splice(arr[j], 1);
crr--;
}
}
return arr;
}
这是我的代码和想法 - 因为我是JS的初学者,你可以给我建议并告诉我我的想法是否好。我也知道我犯了一些错误 - 如果可能的话 - 指出它们
答案 0 :(得分:0)
totals
对象将为数组的每个值保留一个计数器。
function deleteNth(arr, x) {
let totals = {};
return arr.filter(o => (totals[o] = ++totals[o] || 0) < x);
}
console.log(deleteNth([1, 1, 1, 1], 2));
console.log(deleteNth([20, 37, 20, 21], 1));
&#13;
答案 1 :(得分:0)
一种简单的方法是:
const deleteNth = (lst, N) => {
const res = [];
const countNums = {};
lst.forEach((el, idx) => {
countNums[el] = countNums[el] ? countNums[el] + 1 : 1;
if(countNums[el] <= N) {
res.push(el);
}
})
return res;
}
console.log(deleteNth([1,2,1, 3,1,2,3,3, 5], 2))
result => [ 1, 2, 1, 3, 2, 3, 5 ]