如何在JavaScript中检查一个数组是否包含另一个数组的所有元素,包括count?

时间:2019-06-27 12:58:27

标签: javascript arrays

我有两个数组:

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

使用arr1作为基准,arr2不匹配,因为它包含三个1,而arr1只有两个。 arr3,但是应返回true,因为它具有arr1中的元素。

我尝试过

if(_.difference(arr2, arr1).length === 0)

但这未考虑出现次数

6 个答案:

答案 0 :(得分:2)

您可以对第一个数组中的所有值进行计数,并用idtac迭代第二个数组,如果没有给出值或为零,则尽早返回,否则递减计数并继续。

every

答案 1 :(得分:1)

如果找到的值使主数组单元格为false并将标志设置为true,则可以尝试遍历第二个数组并将t与主数组进行比较

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

function checkArray(compareMe, toThis){
  var flag = false;
  
  for(var i = 0; i < toThis.length; i++){
    flag = false;
    for(var j = 0; j < compareMe.length; j++){
      if(compareMe[j] == toThis[i]){
        compareMe[j] = false;
        flag = true;
        break;
      }
    }
  }
  
  return flag;
}

console.log(checkArray(arr1, arr2));
console.log(checkArray(arr1, arr3));

答案 2 :(得分:1)

尝试以下解决方案:

const arr1 = [1, 2, 3, 1, 2, 3, 4],
      arr2 = [1, 3, 1, 1],
      arr3 = [1, 1, 2, 2, 3],
      arr4 = [1, 2, 3, 1, 2, 3, 4, 1];

function containsFn(src, trg) {
  const srcCp = src.slice();
  for(let i = 0; i < trg.length; i++) {
    const index = srcCp.indexOf(trg[i]);
    if(index > - 1) {
      srcCp.splice(index, 1);
    } else {
      return false;
    }    
  }
  return true;
}


console.log(containsFn(arr1, arr2));
console.log(containsFn(arr1, arr3));
console.log(containsFn(arr1, arr4));

答案 3 :(得分:1)

看起来我参加聚会已经很晚了,但这将是一个递归解决方案:

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

function findAllIn(find, search) {
    if (find.length == 0) {
      return true;
    }
    
    i = search.indexOf(find[0]);
    
    if (i == -1) {
      return false;
    }
    
  return findAllIn(find.slice(1,find.length), search.slice(0,i).concat(search.slice(i+1, search.length)));
}

console.log(findAllIn(arr2, arr1)); // false
console.log(findAllIn(arr3, arr1)); // true

答案 4 :(得分:1)

这应该可以解决问题

效率不高,但我认为它很容易理解

const count = (x, xs) =>
  xs.reduce((y, xi) => y + (xi === x ? 1 : 0), 0)

const isInclusive = (xs, ys) =>
  xs.every((xi) => count(xi, xs) >= count(xi, ys))

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

console.log(isInclusive(arr1, arr2))
console.log(isInclusive(arr1, arr3))

答案 5 :(得分:0)

基于以下答案:https://stackoverflow.com/a/4026828/3838031

您可以这样做:

Array.prototype.diff = function(a) {
    return this.filter(function(i) {return a.indexOf(i) < 0;});
};

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

console.log((arr1.diff(arr2).length === 0) ? "True" : "False");
console.log((arr1.diff(arr3).length === 0) ? "True" : "False");
console.log((arr2.diff(arr1).length === 0) ? "True" : "False");
console.log((arr2.diff(arr3).length === 0) ? "True" : "False");
console.log((arr3.diff(arr1).length === 0) ? "True" : "False");
console.log((arr3.diff(arr2).length === 0) ? "True" : "False");