繁体   English   中英

从数组中删除元素 javascript

[英]remove elements from an array javascript

这是 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]);
  });
});

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

您的 function 遍历了错误的变量 ( array.length )

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

问题是 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));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM