在 javascript 中实现了 drop it 功能,但没有得到所需的答案
Impementing drop it function in javascript but the require answer didn't get it
中级算法脚本:放弃
给定数组 arr
,从第一个元素(索引 0)开始遍历并删除每个元素,直到函数 func
return 为真,当迭代元素为通过它。
然后 return 数组的其余部分,一旦条件满足,否则,arr 应该 return 作为一个空数组编辑。
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
returns 为真时设置标志,或者找到第一个元素的索引 returns 为真,或类似的东西。我认为普通的 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;
}));
对此还有一个相当优雅的递归解决方案。这可能不是很节省时间或 space 的方法,但它简单明了:
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;
}));
传递了一个数组和一个函数,如果函数returns true
为第一个元素,我们return整个数组。如果不是,我们删除第一个元素 (.slice (1)
) 并重试,当数组为空时停止。
中级算法脚本:放弃
给定数组 arr
,从第一个元素(索引 0)开始遍历并删除每个元素,直到函数 func
return 为真,当迭代元素为通过它。
然后 return 数组的其余部分,一旦条件满足,否则,arr 应该 return 作为一个空数组编辑。
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
returns 为真时设置标志,或者找到第一个元素的索引 returns 为真,或类似的东西。我认为普通的 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;
}));
对此还有一个相当优雅的递归解决方案。这可能不是很节省时间或 space 的方法,但它简单明了:
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;
}));
传递了一个数组和一个函数,如果函数returns true
为第一个元素,我们return整个数组。如果不是,我们删除第一个元素 (.slice (1)
) 并重试,当数组为空时停止。