【问题标题】:The if statement in the nested loop stops my function嵌套循环中的 if 语句停止了我的函数
【发布时间】:2022-01-09 20:04:41
【问题描述】:

我正在编写一个函数,它以一个数组 (arr1) 作为第一个参数,然后是 N 个参数 (arr2),通过它从数组 (@) 中删除 N 个参数 (arr2) 987654324@)。该函数似乎正在完成这项工作,只是当 if 语句为真时它立即停止。我知道这一点,因为如果我删除 if 语句,循环将迭代到最后。任何想法我做错了什么?

所以返回的数组下面应该是['A','B','E']。

const removeFromArray = function(arr1, arr2) {
    let arr_new = arr1;
    first_loop:
    for (const [y, elem] of arr1.entries()) {
        for (let i=1; i<arguments.length; i++) {
            if ((elem === arguments[i])) {
                arr_new.splice(y);
            }
        }
    }
    return arr_new;
}

alert(removeFromArray(['A', 'B', 'C', 'D','E'],'C','D'));

【问题讨论】:

  • 请注意,let arr_new = arr1; 不会复制arr1

标签: javascript arrays loops if-statement


【解决方案1】:

这是您要完成的任务的另一种选择。虽然箭头函数没有arguments,但您仍然可以通过rest parameters 模拟它。然后你可以只使用一个过滤器

const removeFromArray = (...args) => {
  let arr1 = args[0], arr2 = args.slice(1)
  return arr1.filter(a => arr2.indexOf(a) === -1)
}

console.log(removeFromArray(['A', 'B', 'C', 'D', 'E'], 'C', 'D'));

【讨论】:

  • 谢谢,这很清楚。只是一个问题,您认为我运行两个循环的原始方法是否可行?我调整了拼接,使其仅从数组中删除一个元素,但结果仍然存在缺陷,因为它仅删除了一个元素并且没有遍历其他 arr2 参数。我猜这与let arr_new = arr1; 不做副本有关?
  • @fg42 - 我必须承认,当我试图解开你使用 .entries() 然后循环遍历 arguments 的技术时,我有点迷失了,当时决定追求类似但更优化的解决方案。我认为我的解决方案具有您所做的精神,但可能更易于阅读
【解决方案2】:

splice 修改原始数组,以便在调用时进行。它只是从y 中删除所有元素,直到arr_new 结束,arr_new 指的是arr1

const foo = [1, 2, 3, 4];
foo.splice(2);
console.log(foo); // [1, 2]

arr1.entries() 是一个迭代器,它在内部继续跟踪 arr1,因此当您修改 arr1 时,它也会修改 entries,所以这就是您的循环停止的原因 - 有无元素拼接后

要解决这个问题,你可以修改你的代码

    if ((elem === arguments[i])) {
        arr_new.splice(y, /*? remove only one element*/1);
    }

⚠️上面的解决方案仍然存在索引问题,因为您修改了原始数组并在该索引上进行中继。这会导致整体结果不正确

这是从数组中删除的正确解决方案,无需修改,复杂度 O(n) 更好

const removeFromArray = function(arr1, ...arr2) {
    const exclude = arr2.reduce((acc, curr) => {
        acc.add(curr);
        return acc;
    }, new Set());
    return arr1.filter((it) => {
        return !exclude.has(it)
    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 2015-10-01
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多