在 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;}));

您需要在 func returns 为真时设置标志,或者找到第一个元素的索引 returns 为真,或类似的东西。我认为普通的 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;
}));

对此还有一个相当优雅的递归解决方案。这可能不是很节省时间或 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)) 并重试,当数组为空时停止。