【问题标题】:How do I remove all items in arrayA from arrayB? in javascript如何从数组中删除数组中的所有项目?在javascript中
【发布时间】:2017-09-10 02:37:03
【问题描述】:

这感觉像是一个非常基本的 javascript 问题,但我有两个数组:

var arrayA =['content','I dont','want'];
var arrayB = ['content','want','puppies'];

想要的结果:

arrayB = ['puppies']

数组中的项目是字符串。

我该怎么做? (如果答案在 IE8+ 中有效,则加分)

【问题讨论】:

  • 你试过什么?也许一个好的起点是如何从数组中删除一些东西?
  • 为什么在arrayB的元素中是小狗。我的意思是这里实际发生了什么样的操作。
  • 这里的“我不”应该怎么办?
  • 我了解如何从数组中删除一个单数项,只是希望有一种更简单的方法,而不是遍历数组中的每个项,然后检查另一个数组中该项的索引,然后将其删除如果它在那里。做某事似乎是一种痛苦的方式,我猜想有一个内置功能。此外,字符串中的文本纯粹是一个示例,可以很容易地使用“foo”“bar”。我试图将其归结为最简单的形式,因为我正在构建的完整内容要复杂得多。我只是忘记了如何做到这一点,找不到有用的答案谷歌搜索

标签: javascript arrays


【解决方案1】:

您可以过滤arrayB 并仅获取arrayA 中未包含的元素

var arrayA =['content','I dont','want'],
    arrayB = ['content','want','puppies'].filter(a => !arrayA.includes(a));

console.log(arrayB);

ES5

var arrayA =['content','I dont','want'],
    arrayB = ['content','want','puppies'].filter(function (a) {
        return arrayA.indexOf(a) === -1;
    });

console.log(arrayB);

【讨论】:

    【解决方案2】:

    从arrayB中删除arrayA中的所有项目

    使用Array.prototype.forEach()Array.prototype.splice()函数的解决方案:

    var arrayA =['content','I dont','want'],
        arrayB = ['content','want','puppies'];
    
    arrayA.forEach(function (w) {
        var idx = arrayB.indexOf(w);
        ~idx && arrayB.splice(idx, 1);
    });
    
    console.log(arrayB);

    【讨论】:

      【解决方案3】:

      对于值类型,以下应该可以工作:(可惜在 IE8 中没有 - 正如所指出的那样!)

      function (arrayA, arrayB) {
        return arrayB.filter(function(b) {
          return arrayA.indexOf(b) == -1;
        });
      }
      

      【讨论】:

      • 这在 IE8 中不起作用。 IE8 不支持 filter 或 indexOf
      • @jas7457 我想我真的很了解filter。虽然indexOf() 缺乏 IE8 支持对我来说确实是个新闻!每天学习新东西!
      • 可以将 indexOf 添加到 IE8 stackoverflow.com/questions/3629183/…
      【解决方案4】:

      这将使您降级到 IE9,但 IE8 不支持 indexOf。如果您绝对需要 IE8 支持,则必须为 indexOf 编写一个 polyfill。

      var arrayA =['content','I dont','want'];
      var arrayB = ['content','want','puppies'];
      
      for(var i = 0; i < arrayA.length; i++){
          var index = arrayB.indexOf(arrayA[i]);
        if(index !== -1) {
          arrayB.splice(index, 1);
        }
      }
      
      console.log(arrayB);
      

      【讨论】:

        【解决方案5】:
        arrayA.forEach((valueA)=>{
            let idx = (arrayB.findIndex( (valueB)=>valueB === valueA))
            if(idx != -1){
              arrayB.splice(idx,1)
            }
        })
        

        【讨论】:

          【解决方案6】:

          这将使您进入 IE8

          var arrayA =['content','I dont','want'];
          var arrayB = ['content','want','puppies'];
          
          for (var i = arrayB.length - 1; i >= 0; i--) {
              for (var j = arrayA.length - 1; j >= 0; j--) {
                  if (arrayA[j] == arrayB[i]) {
                      arrayB.splice(i, 1);
                  }
              }
          }
          
          console.log(arrayB);
          

          【讨论】:

            【解决方案7】:

            ES3 解决方案。

            var arrayA = ['content', 'I dont', 'want'];
            var arrayB = ['content', 'want', 'puppies'];
            
            for (var bIdx = arrayB.length - 1; bIdx >= 0; bIdx -= 1) {
              for (var aIdx = 0; aIdx < arrayA.length; aIdx += 1) {
                if (arrayB[bIdx] === arrayA[aIdx]) {
                  arrayB.splice(bIdx, 1);
                  break;
                }
              }
            }
            
            console.log(arrayB);

            请注意,外部循环 (arrayB) 反向运行,因为您将使用 Array#splice 从数组中删除项目,因此在您迭代它时它将被重新索引,这意味着您可能会错过一些项目如果前向迭代。

            有关更多示例和说明,请参阅以下内容。

            How to remove element from array in forEach loop?

            只要为您使用的方法加载适当的填充程序,您就可以在 IE8 上愉快地使用函数式方法(只要您不使用稀疏数组)。

            https://github.com/es-shims/es5-shim

            https://github.com/es-shims/es6-shim

            https://github.com/es-shims/es7-shim

            如果您不必改变原始数组,那么您可以使用Array#filter 概念并将旧数组替换为新数组。

            var arrayA = ['content', 'I dont', 'want'];
            var arrayB = ['content', 'want', 'puppies'];
            
            var result = [];
            for (var bIdx = 0; bIdx < arrayB.length; bIdx += 1) {
              var itemB = arrayB[bIdx];
              var found = false;
              for (var aIdx = 0; aIdx < arrayA.length; aIdx += 1) {
                if (itemB === arrayA[aIdx]) {
                  found = true;
                  break;
                }
              }
              if (found !== true) {
                result.push(itemB);
              }
            }
            arrayB = result;
            
            console.log(arrayB);

            请注意,我们现在可以转发迭代这两个数组,因为它们没有被变异,也没有发生重新索引。

            【讨论】:

              猜你喜欢
              • 2014-05-01
              • 2015-10-25
              • 1970-01-01
              • 2020-12-28
              • 1970-01-01
              • 1970-01-01
              • 2021-10-19
              • 2015-07-21
              • 2021-05-28
              相关资源
              最近更新 更多