【问题标题】:remove elements from an array javascript从数组javascript中删除元素
【发布时间】:2022-12-26 09:42:44
【问题描述】:

这是 odin 项目的第四个项目,所有测试都通过了,但是第五个需要删除所有元素的测试失败了,当我运行代码时,它返回一个数组,其中包含原始数组中一半的元素,然后再进行变异。

我不知道为什么在第五次测试中它不返回空数组。

const removeFromArray = function (array, ...deleteElement) {
    for (let i = 0; i < array.length; i++) {
        if (array.includes(deleteElement[i])) {
            array.splice(array.indexOf(deleteElement[i]), 1);
        }
    }
    return array;
};

const randomArray = [1, 2, 3, 4];
console.log(removeFromArray(randomArray, 1, 2, 3, 4));

这是测试

const removeFromArray = require('./removeFromArray')

describe('removeFromArray', () => {
  test('removes a single value', () => {
    expect(removeFromArray([1, 2, 3, 4], 3)).toEqual([1, 2, 4]);
  });
  test('removes multiple values', () => {
    expect(removeFromArray([1, 2, 3, 4], 3, 2)).toEqual([1, 4]);
  });
  test('ignores non present values', () => {
    expect(removeFromArray([1, 2, 3, 4], 7, "tacos")).toEqual([1, 2, 3, 4]);
  });
  test('ignores non present values, but still works', () => {
    expect(removeFromArray([1, 2, 3, 4], 7, 2)).toEqual([1, 3, 4]);
  });
  test.skip('can remove all values', () => {
    expect(removeFromArray([1, 2, 3, 4], 1, 2, 3, 4)).toEqual([]);
  });
  test.skip('works with strings', () => {
    expect(removeFromArray(["hey", 2, 3, "ho"], "hey", 3)).toEqual([2, "ho"]);
  });
  test.skip('only removes same type', () => {
    expect(removeFromArray([1, 2, 3], "1", 3)).toEqual([1, 2]);
  });
});

【问题讨论】:

  • 关于你之前的问题,现在已经被删除了,我只想说,编程中总有一些概念,你刚开始学的时候,对你来说没有任何意义,看起来不清楚,但是当你继续学习的时候,就知道了。更多最重要的是做一些项目,在某些时刻,砰!你会意识到这是为了什么,我们打算使用构造函数的目的是什么,等等,所以这里重要的是进行搜索,但如果你注意到了一般的想法,现在就可以了,不要再想太多了它,继续前进!你会意识到,这只是需要一些时间 :)

标签: javascript arrays splice


【解决方案1】:

for 中,您正在遍历错误的元素。应该是deleteElement.length,不是array.length

const removeFromArray = function(array, ...deleteElement) {
  for (let i = 0; i < deleteElement.length; i++) {
    if (array.includes(deleteElement[i])) {
      array.splice(array.indexOf(deleteElement[i]), 1);
    }
  }
  return array;
};

const randomArray = [1, 2, 3, 4];
console.log(removeFromArray(randomArray, 1, 2, 3, 4));

编辑: 尽管当数组中有 2 个相同的元素要删除时,这将无法正常工作。这是另一种实现,它删除所有匹配的索引,而不仅仅是第一个。

const removeFromArray = function(array, ...deleteElement) {
  for (let i = 0; i < deleteElement.length; i++) {
    let foundIndex = array.indexOf(deleteElement[i]);
    while (foundIndex !== -1) {
      array.splice(foundIndex, 1);
      foundIndex = array.indexOf(deleteElement[i]);
    }
  }
  return array;
};

const randomArray = [1, 2, 3, 1, 4];
console.log(removeFromArray(randomArray, 1));

【讨论】:

  • 它有效,谢谢!但我不明白为什么在我使用遍历数组本身来搜索 deleteElement 是否在此数组中时循环抛出 deleteElement ?
  • 首先你需要循环deleteElements,因为这些是我们需要搜索的项目。通过 array 循环并搜索数组是否包含要删除的项目是在 includes 函数中“在幕后”完成的
  • 还添加了第二个实现,它将处理数组中的重复项,因此 removeFromArray([1,2,3,1,4], 1) 将返回 2,3,4
  • 为什么使用经典的 for 循环而不是 for..of 循环?
  • @Dawid.T 非常感谢,我真的很感激。
【解决方案2】:

你的函数遍历了错误的变量 (array.length)

const removeFromArray = function (array, ...deleteElement) {
    for (let element of deleteElement) {
        if (array.includes(element)) {
            array.splice(array.indexOf(element), 1);
        }
    }
    return array;
};

【讨论】:

  • 感谢您的回复它也通过了,但我不明白为什么循环遍历 deleteElement 而不是数组本身?
  • 因为要删除 deleteElement 中的所有元素。如果您遍历数组,它将无法正确迭代。例如,removeFromArray([1, 4], 2, 3, 4) 不会删除 4。
  • 非常感谢,老实说,这些信息对我帮助很大,我尝试了代码,但它并没有删除“4”,现在我很清楚了,再次感谢!
【解决方案3】:

问题是 for 循环正在动态使用 array.length 属性,这意味着每次通过循环时都会对其进行求值,因此由于您要从原始数组中删除元素,因此该值不是常量并且在某些时候数组长度值和 i 计数器将不同步。

你只需要将数组长度值保存在变量中所以从数组中删除对象后它保持不变。

var arrLen = array.length;
for (let i = 0; i < arrLen; i++) {
    ...
}

更新:

在此处粘贴完整代码以及一个实时示例: https://jsfiddle.net/bcngr/sbk1yhmn/

const removeFromArray = function (array, ...deleteElement) {
    var arrLen = array.length; // Save the length value before any modification to the array
    for (let i = 0; i < arrLen; i++) { // use the variable instead of array.length
        if (array.includes(deleteElement[i])) {
            array.splice(array.indexOf(deleteElement[i]), 1);
        }
    }
    return array;
};

const randomArray = [1, 2, 3, 4];
console.log(removeFromArray(randomArray, 1, 2, 3, 4));

【讨论】:

  • 感谢您的回复,但我尝试了这个解决方案,它返回相同的输出而不是一个空数组
  • 这没有任何意义......数组的长度不会影响任何东西,它仍然无法正确获得输出。
  • 请参阅上面的工作现场示例。
  • 是的,它实际上返回一个空数组,谢谢,很抱歉这是我的错误。但我不明白添加 arrLen 和 array.length 两者的值相同时有什么区别?
猜你喜欢
  • 1970-01-01
  • 2017-03-21
  • 2010-10-17
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 2015-10-28
相关资源
最近更新 更多