在 javascript 中实现删除它的功能,但没有得到要求的答案

问题描述

中级算法脚本:放弃

给定数组 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,1],function(n) {return n === 1;}));
console.log(dropElements([1,2,3,9,2],function(n) {return n > 2;}));
  • 我得到的第一个测试的输出是:[1,1] 和
  • 第二次测试得到:[ 3,9 ] 但所需的输出应该是:[1,1] 和 [3,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,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,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,function(n) {
  return n > 2;
}));

传入一个数组和一个函数,如果函数为第一个元素返回true,我们返回整个数组。如果不是,我们删除第一个元素 (.slice (1)) 并重试,当数组为空时停止。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...