如何查找一个数组是否包含另一个具有相同元素的数组

4
我正在寻找一种方法来判断一个数组是否包含了所有不同的元素。
例如,b.containsDistinct(a) 将返回 true,而 c.containsDistinct(a) 将返回 false。
a = [1, 1, 1, 2]

b = [1, 2, 1, 1, 3] // return true
c = [1, 2, 3] // return false

我能找到的解决方案只有a.every(i => b.indexOf(i) !== -1),但这对于元素相同的情况不起作用。

你会如何解决这个问题?

3个回答

3

您可以计算这些值并检查计数是否为零或更小。

function distinct(a, b) {
    var counts = {};
    a.forEach(v => counts[v] = (counts[v] || 0) + 1);
    b.forEach(v => counts[v] = (counts[v] || 0) - 1);
    return Object.values(counts).every(count => count <= 0);
}

console.log(distinct([1, 1, 1, 2], [1, 2, 1, 1, 3]));
console.log(distinct([1, 1, 1, 2], [1, 2, 3]));


1
你可以利用 hashmap 在 JavaScript 中通过数组轻松实现。

let a = [1, 1, 1, 2]
let b = [1, 2, 1, 1, 3] // return true
let c = [1, 2, 3] // return false

Array.prototype.containsDistinct = function(a){

 let map1 =[];
 this.forEach((val)=>{
  if(map1[val] === undefined){
   map1[val] = 1;
  }
  else{
   map1[val]+=1;
  }
 })
 let map2 = [];
 a.forEach((val)=>{
  if(map2[val] === undefined){
   map2[val] = 1;
  }
  else{
   map2[val]+=1;
  }
 })
 let flag = true;
 map2.forEach((val,key)=>{  
  if(map1[key] === undefined){
   flag = false
  }
  else if(map1[key]!== map2[key]){ 
   flag = false;     
  }
 })
 return flag;
}
console.log(b.containsDistinct(a));
console.log(c.containsDistinct(a));


0
我的方法是首先计算两个数组中所有值的分布,然后检查第一个数组中的每个值在第二个数组中出现的次数是否相同或更少。
let a = [1, 1, 1, 2];

let b = [1, 2, 1, 1, 3];
let c = [1, 2, 3];

function getDistribution(A) {
  return A.reduce(
    (distr, v) => ({ ...distr, [v]: distr[v] ? distr[v] + 1 : 1 }),
    {}
  );
}

function containsDistinct(A, B) {
  let distrA = getDistribution(A);
  let distrB = getDistribution(B);

  return Object.entries(distrA).every(([k, v]) => distrB[k] && distrB[k] >= v);
}

console.log("a in b = ", containsDistinct(a, b));
console.log("a in c = ", containsDistinct(a, c));

输出结果为:

a在b中 = true
a在c中 = false


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接