【问题标题】:How to remove extra occurrences of a reference array如何删除引用数组的额外出现
【发布时间】:2019-12-13 05:28:22
【问题描述】:

假设我们有两个这样的数组:

let s1 =  ["A", "B", "C", "D", "B"]  // Note: "B" has been occurred 2 times
let s2 =  ["A", "B", "C", "D", "B", "A", "X", "Y"] // // Note: "B" has been occurred 2 times just like s1 but we have another occurrence for "A" 

我想根据这两个数组创建一个新数组 (let s3),我们将删除出现次数多于数组s1中相同元素出现次数的元素

所以s3 array 会是这样的:

let s3 =  ["A", "B", "C", "D", "B", "X", "Y"] // we just removed "A" cause it occurred more than "A" occurances in s1

请注意,我们还需要其他任何东西 ("X", "Y")。我们只想处理额外的事件

到目前为止,我可以找到这样的重复出现的索引,但我找不到一种方法来比较每个出现以查看它是否是额外的(复杂的):

    let s1 =  ["A", "B", "C", "D", "B"]  
    let s2 =  ["A", "B", "C", "D", "B", "A", "X", "Y"]  

    var s3 = [];  
     
    for (let i = 0; i < s2.length; i++) {
    for (let j = 0; j < s1.length; j++) {
     if (s2[i] === s1[j]) {
         s3.push(i);
         break;
  }
}        
  }     
    console.log(s3)

我的英语很差,我不知道我能不能解释一下这个问题!

注意:我可以简单地使用 s3 = [...new Set(s2)] 删除重复的元素,但我想要别的东西。

【问题讨论】:

  • 感谢 Michael 的评论,但它有所不同......我可以简单地使用 s2 = [...new Set(s2)] 删除重复的元素,但我想要别的东西......
  • 抱歉,重新阅读问题。你想要数组的union
  • 这是您正在寻找的答案吗? stackoverflow.com/questions/9229645/…
  • 谢谢...我会试试那些...

标签: javascript


【解决方案1】:

由于您想保留最初在 s1 中的所有内容,但仅添加来自 s2 的项目(如果它们尚未在其中),您可以最初将 s3 设置为 s1。然后循环s2,如果s1 not 具有该值,则将其推入s3

const s1 = ["A", "B", "C", "D", "B"];
const s2 = ["A", "B", "C", "D", "B", "A", "X", "Y"];

const s3 = [...s1];

s2.forEach(d => {
  if (!s1.includes(d)) s3.push(d);
});

console.log(s3);

【讨论】:

  • 不错的捷径,但如果第一个包含不在第二个中的元素怎么办?
  • 多么棒的捷径!
  • @NinaScholz,因为 OP 明确表示他们只是想添加额外的事件,所以我这样做了。否则,第二个中的元素 not 将不会被处理(移除)
  • 不错的快捷方式。只需将 s1 解构更改为 const s3 = [...s1.filter(s =&gt; s2.includes(s))];
【解决方案2】:

您可以计算第一组的值并返回给定计数的值,或者如果不知道则返回所有项目。

var s1 =  ["A", "B", "C", "D", "B"],
    s2 =  ["A", "B", "C", "D", "B", "A", "X", "Y"],
    count = s1.reduce((m, v) => m.set(v, (m.get(v) || 0) + 1), new Map),
    s3 = s2.filter(v => count.get(v) ? count.set(v, count.get(v) - 1) : !count.has(v));

console.log(...s3);

【讨论】:

    【解决方案3】:

    您可以使用Mapfilter

    • 先将Map数组1转为[key, value]格式
    • 迭代第二个数组,如果在 Map 中找到并且值大于零,则返回 true,否则返回 false,
    • 如果没有找到返回 true

    let s1 =  ["A", "B", "C", "D", "B"]  
    let s2 =  ["A", "B", "C", "D", "B", "A", "X", "Y"]  
    
    let map = new Map()
    
    s1.forEach(v=>{
      if(map.has(v)){
        map.set(v,map.get(v)+1)
      } else{
        map.set(v,1)
      }
    })
    
    let final = s2.filter(val=>{
      if(map.has(val)){
        if(map.get(val)){
          map.set(val, map.get(val)-1)
          return true
        } 
        return false
      }
      return true
    })
    
    console.log(final)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-19
      • 2010-10-23
      • 2014-01-13
      • 2015-01-16
      • 1970-01-01
      相关资源
      最近更新 更多