在javascript中实现drop it函数,但要求的答案没有得到它



中间算法脚本:Drop it

给定数组arr,从第一个元素(0索引)开始迭代并删除每个元素,直到函数func在迭代元素经过它时返回true。

一旦条件满足,则返回数组的其余部分,否则,arr应作为空数组返回。

function dropElements(arr, func) {
let newArr=[];
for(let i=0; i<arr.length; i++){
if(func(arr[i])){
newArr.push(arr[i])
}
}
return newArr;
}
console.log(dropElements([0, 1, 0, 1], function(n) {return n === 1;}));
console.log(dropElements([1, 2, 3, 9, 2], function(n) {return n > 2;}));
  • 我得到第一个测试的输出是:[1,1]和
  • 第二次测试得到:[3,9]但所需输出应为:[1,0,1]和[3,9,2];

func返回true时,您需要设置一个标志,或者找到它返回true的第一个元素的索引,或者类似的东西。我认为简单的findIndexslice在这里是最简单的:

function dropElements(arr, func) {
const index = arr.findIndex(func);
return index === -1 ? [] : arr.slice(index);
}
console.log(dropElements([0, 1, 0, 1], function(n) {
return n === 1;
}));
console.log(dropElements([1, 2, 3, 9, 2], function(n) {
return n > 2;
}));

如果你必须手动迭代:

function dropElements(arr, func) {
const newArr = [];
let found = false;
for (let i = 0; i < arr.length; i++) {
if (!found && func(arr[i])) {
found = true;
}
if (found) {
newArr.push(arr[i])
}
}
return newArr;
}
console.log(dropElements([0, 1, 0, 1], function(n) {
return n === 1;
}));
console.log(dropElements([1, 2, 3, 9, 2], function(n) {
return n > 2;
}));

还有一个相当优雅的递归解决方案。这可能不是很节省时间或空间,但它是简单明了的:

const dropElements = (xs, fn) => 
xs .length == 0
? []
: fn (xs [0]) 
? xs 
: dropElements (xs .slice (1), fn)
console.log(dropElements([0, 1, 0, 1], function(n) {
return n === 1;
}));
console.log(dropElements([1, 2, 3, 9, 2], function(n) {
return n > 2;
}));

传递一个数组和一个函数,如果函数返回第一个元素的true,则返回整个数组。如果不是,则删除第一个元素(.slice (1))并重试,直到数组为空时停止。

相关内容

最新更新