【问题标题】:Remove only first duplicate value and all other matching values after comparing two arrays比较两个数组后仅删除第一个重复值和所有其他匹配值
【发布时间】:2020-09-28 06:39:27
【问题描述】:

我有两个数组,我正在尝试从第 2 个数组中删除所有匹配值。 但是如果值是重复的,它应该只删除第一个重复值。

例如 - 我的两个数组是

arr1=[1,1,2,3,4,4]
arr2=[1,3,4]

结果应该是 = [1,2,4]

或者如果我的数组是

arr1=[1,1,1,2,3,4,4,4]
arr2=[1,3,4]

结果应该是 = [1,1,2,4,4]

我尝试了使用过滤器和包含的不同方法,但没有任何效果。 下面的代码删除了所有匹配的值,但我想删除所有匹配的值,并且只有第一个重复值才匹配。

  arr1 =
    arr1.filter(f => !arr2.includes(f));

【问题讨论】:

  • 这些数组是否已经排序?

标签: javascript arrays angular


【解决方案1】:
  this.arr2.forEach(x=>{
    if (this.arr1.indexOf(x)>=0)
      this.arr1.splice(index,1)
  })

  this.arr1=this.arr1.filter((x,index)=>this.arr2.indexOf(x)<0 ||
        this.arr1.indexOf(x)!=index )

【讨论】:

  • 第二种解决方案让我的膝盖发软
  • 要知道一个元素是否是第一次出现(或不是),在过滤器中我们可以使用第二个参数(“索引”)并检查索引是否等于第一个的索引发生,例如this.arr1=this.arr1.filter((x,index)=&gt;this.arr1.indexOf(x)==index )返回唯一元素(好吧,这种情况下最好使用reduce)
  • 诺诺,我明白了,我只是想让你知道我觉得它很漂亮:D
【解决方案2】:

为了只删除第一个匹配项,您可以改用indexOf。因此,解决方案是:

let arr1 = [1, 1, 2, 3, 4, 4];
let arr2 = [1, 3, 4];

for (let i = 0; i < arr2.length; i++) {
  if (arr1.includes(arr2[i])) {
    let matchedItemIndex = arr1.indexOf(arr2[i]);
    arr1[matchedItemIndex] = null;
  }
}

arr1 = arr1.filter((x) => x != null);
console.log(arr1); // Expected Result: [1, 2, 4]

【讨论】:

    【解决方案3】:

    有很多方法可以做到这一点。上面的大部分答案都是对的。但我建议使用集合

    let arr1 = [1, 1, 2, 3, 4, 4];
    let arr2 = [1, 3, 4];
    let result = [];
    
    for(let i = 0; i < arr1.length; i++) {
       let index = arr2.indexOf(arr1[i]);
       if(index > -1) {
          arr2.splice(index, 1);
       } else {
         result.push(arr1[i]);
       }
    }
    
    console.log(result); /// [1, 2, 4]
    
    

    【讨论】:

      【解决方案4】:

      使用Setreduce

      const process = (arr1, arr2) => {
        const set2 = new Set(arr2);
        return arr1.reduce((acc, curr) => {
          set2.has(curr) ? set2.delete(curr) : acc.push(curr);
          return acc;
        }, []);
      };
      
      let arr1 = [1, 1, 2, 3, 4, 4];
      let arr2 = [1, 3, 4];
      console.log(process(arr1, arr2));
      
      
      arr1=[1,1,1,2,3,4,4,4]
      arr2=[1,3,4]
      console.log(process(arr1, arr2));

      【讨论】:

        猜你喜欢
        • 2013-10-11
        • 1970-01-01
        • 1970-01-01
        • 2012-01-31
        • 1970-01-01
        • 2016-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多