中间算法脚本: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的第一个元素的索引,或者类似的东西。我认为简单的findIndex
和slice
在这里是最简单的:
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)
)并重试,直到数组为空时停止。