【问题标题】:exclude all except between two numbers from array排除数组中两个数字之间的所有内容
【发布时间】:2021-01-28 05:16:30
【问题描述】:

试图创建一个函数,从数组中删除每个数字(就地),除了函数中最后两个参数之间的数字。这些应该留下。 我得到了这个练习:

https://javascript.info/array-methods

那么为什么这不起作用?

/*
 * Array excercize Filter range in place.
 * remove all except between a and b
 */
"strict"

var arr = [5, 3, 8, 1, 0, 11, 13, 100, 72, 80, 30, 22];



function filterRangeInPlace(arr, a, b) {
  arr.forEach(function(item, index, array) {
    if ((item < a) || (item > b)) {
      array.splice(index, 1);
    }
  });
}

filterRangeInPlace(arr, 11, 30);
console.log(arr);

【问题讨论】:

  • 使用反向 for 循环(从最后一个索引到 0),以便 splice 不会影响未来的索引。
  • forEach 不尊重从数组中删除元素的时间。这意味着,当您从数组中的index 删除一项时,index + 1 的下一项将成为index 的元素,然后forEach 转到index + 1,跳过该项。
  • 这能回答你的问题吗? How to remove element from array in forEach loop?

标签: javascript arrays


【解决方案1】:

forEach 函数不尊重从数组中删除元素的情况。这意味着当您从index 的数组中删除一个项目时,数组中index + 1 的下一个项目将成为index 的元素,然后forEach 移动到index + 1 的项目,跳过该项目现在是index

您可以改用while 循环来纠正此行为。

var arr = [5, 3, 8, 1, 0, 11, 13, 100, 72, 80, 30, 22];

function filterRangeInPlace(arr, a, b) {
    arr.forEach(function(_, index, array) {
        var item = array[index];
        while((item < a) || (item > b)) {
            array.splice(index, 1);
            if (index >= array.length) break;
            item = array[index];
        }
    });
}

filterRangeInPlace(arr, 11, 30);
console.log(arr);

【讨论】:

  • 不出所料,这是一个很常见的错误,有很多重复项可供选择...
  • 我读过那篇文章。必须承认我刚刚看到代码是相似的,然后反过来做。所以我想念另一种问题。我现在明白为什么会这样了。我也想念把它当作一个简单的练习,几乎不可能有惊喜。对不起,伙计们,你摇滚我很烂。有时只是感到沮丧,因为我觉得我永远在“儿童游泳池”中挣扎,而不是已经在深水区游泳:-/
  • @brat 好吧,帖子试图说的一般情况是forEach 在处理数组时通常不是一个很好的功能您正在积极添加和删除项目 数组的就地编辑可能会导致这些类型的问题,并且通常也是其他基于数据的错误的来源。相反,使用帖子描述的反向方法或使用filter 函数(无论如何它具有更简单的语法)来返回一个全新的数组,以完全避免就地问题。
  • 必须“就地”进行,以遵守规则。希望我暂时不会忘记这个错误。
【解决方案2】:

在您的代码中,当在array 变量上使用splice 时,它也适用于arr 值。所以如果你删除array 上的一个元素,它也会从arr 中删除一个元素,因为arrayarr 的引用。

您可以使用Array.filter 来代替forEach

/*
 * Array excercize Filter range in place.
 * remove all except between a and b
 */
"strict"

var arr = [5, 3, 8, 1, 0, 11, 13, 100, 72, 80, 30, 22];



function filterRangeInPlace(arr, a, b) {
  return arr.filter((item) => item >= a && item <= b);
}

console.log(filterRangeInPlace(arr, 11, 30));

【讨论】:

  • 练习的重点是使用splice 对数组就地进行过滤。 filter 不会就地编辑数组,而是返回一个全新的数组。 (这通常是更可取的行为,以免意外改变原始数组,但同样,这不是练习的目的。)
【解决方案3】:

/*
 * Array exercise Filter range in place.
 * remove all except between a and b
 */
"strict"

var arr = [5, 3, 8, 1, 0, 11, 13, 100, 72, 80, 30, 22];



function filterRangeInPlace(arr, a, b) {
  return arr.filter(function(item) {
    if ((item < a) || (item > b)) {
      return item;
    }
  });
}

arr = filterRangeInPlace(arr, 11, 30);
console.log(arr);

【讨论】:

    猜你喜欢
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 2021-05-20
    • 1970-01-01
    • 2020-06-30
    • 2012-05-28
    • 1970-01-01
    相关资源
    最近更新 更多