循环-从数组中删除元素

时间:2020-07-11 16:39:44

标签: javascript

我正在尝试从另一个数组中找到的数组中删除特定元素。我的数组返回不变。我的假设是我在if语句中的条件不正确,但是,我无法在网上找到明确的解释。任何帮助将不胜感激。

尝试从...args删除array

    <script>
        removeFromArray = function(array, ...args) {

            let removalItems = Array.from(args);

            for (i = 0; i < removalItems.length; i++) {
                if (array === removalItems[i]) {
                    array.splice(i, 1);
                } else {
                    i++
                }
            }
            // console.log(array);
            return array;
        }
        removeFromArray([1, 2, 3, 4], 3, 2)
    </script>
    ```

6 个答案:

答案 0 :(得分:2)

您的代码中的问题是您正在通过removeFromArray进行一次循环,但没有遍历数组以检查数组中的每个元素是否都必须使用嵌套循环

removeFromArray = function(array, ...args) {

            let removalItems = Array.from(args);

            for (i = 0; i < array.length; i++) {
              for (j = 0; j < removalItems.length; j++) {
                if (array[i] === removalItems[j]) {
                    array.splice(i, 1);
                    i--
                } 
                else continue
            }
        }
        return array
      }
        
        console.log(removeFromArray([1, 2, 3, 4], 3, 2))

另一种方法是使用过滤器

removeFromArray = function(array, ...args) {
        let removalItems = Array.from(args);
       return array.filter(x=>!removalItems.some(y=>x==y))
    }
    console.log(removeFromArray([1, 2, 3, 4], 3, 2));

答案 1 :(得分:1)

使用std::map可以简化此操作,并且不会变异原始数组

filter()

答案 2 :(得分:1)

您几乎没有错误,如果它们不在同一位置,也将无法工作,并且在您删除带有切片的项目时,您需要递减i,否则您将跳过项目

ABC:::nw_fct

但是过滤器很容易实现

const removeFromArray = (array, ...removalItems) => {
    for (i = 0; i < array.length; i++) {
        if (removalItems.includes(array[i])) {
            array.splice(i, 1);
            i--;
        }
    }
    return array;
}

答案 3 :(得分:-1)

在您的for循环中,您必须

for (let j=0; j<array.length; j++)
    if (array[j]===removalItems[i])
        ...the rest is the same

答案 4 :(得分:-1)

使用相同的代码模式,您会遇到3个错误:

        let removalItems = Array.from(args);

        for (i = 0; i < array.length; i++) {
           for (j = 0; j < removalItems.length; j++) {
              if (array[i] === removalItems[j]) {
                  array.splice(i, 1);
                  i--
              }
           }
        }

此外,您还需要另一个for循环来迭代所有选项。 这段代码最终效率低下,但适用于大多数应用程序。我删除了else语句,因为每次循环时您已经在惩罚我。

答案 5 :(得分:-1)

您正在将数组视为具有单个对象。

  1. 遍历数组,并使用include方法检查该元素是否存在于removeItems数组中。如果是,则拼接,否则增加。

removeFromArray = function(array, ...args) {

            let removalItems = Array.from(args);
            for (i = 0; i < array.length; i++) {
                if (removalItems.includes(array[i])) {
                    array.splice(i, 1);
                 i--;
                } 
            }
            // console.log(array);
            return array;
        }
        console.log(removeFromArray([1, 2, 3, 4], 3, 2));

这是另一个解决方案,在迭代数组时不拼接数组。

removeFromArray = function(array, ...args) {

            let removalItems = Array.from(args);
            let result = [];
            for (i = 0; i < array.length; i++) {
                if (!removalItems.includes(array[i])) {
                    result.push(array[i]);
                } 
            }
            // console.log(array);
            return result;
        }
        console.log(removeFromArray([1, 2, 3, 4], 3, 2));