尝试检测一个数组是否缺少另一个数组的元素

时间:2019-03-13 22:18:32

标签: javascript arrays loops

我有以下代码将array1与array2进行比较,以确定array1是否缺少array2的值:

var array1 = ['bob', 'george'];
var array2 = ['bob', 'george', 'frank'];
var isMissing = false;

console.log(missing(array1, array2));

function missing(a,b) { 
    if (a > b) {
        var length = a.length;
    } else if (b > a) {
        var length = b.length;  
    } else {
        var length = a.length;    
    }

for (var i = 0; i < length; i++ ) {
    if (b.indexOf(a[i]) == -1) {
         isMissing = true;
    } else {
         isMissing = false;        
    }

    if (isMissing == 'true') {
    break;
    }
}

return isMissing;
}

以上内容并非始终有效。有关方案和结果与预期结果,请参见下表:

var array1 = ['bob', 'george'];
var array2 = ['bob', 'george', 'frank']; // result:true, expected: true

var array1 = ['bob', 'frank'];
var array2 = ['bob', 'george', 'frank']; // result:true, expected: true

var array1 = ['frank', 'george'];
var array2 = ['bob', 'george', 'frank']; // result:true, expected: true

var array1 = ['frank', 'bob', 'george'];
var array2 = ['bob', 'george', 'frank']; // result:false, expected: false

var array1 = ['frank', 'george', 'sue', 'frank'];
var array2 = ['bob', 'george', 'frank'];  // result:false, expected: true

var array1 = ['frank', 'george', 'sue', 'frank'];
var array2 = ['bob', 'george', 'frank', 'janet'];  // result:false, expected: true

var array1 = ['frank', 'george'];
var array2 = ['frank', 'frank']; // result: false, expected: true

我不确定是什么问题...

我已经读过this thread,但对我没有任何帮助,因为我不需要知道缺少哪个元素,我只需要知道是否缺少一个元素即可。

请没有外部库。谢谢。

5 个答案:

答案 0 :(得分:2)

  # agent section
  datadog:
    build: datadog
    links:
     - redis # ensures that redis is a host that the container can find
     - web # ensures that the web app can send metrics
    environment:
     - DD_API_KEY=34f-------63c
     - DD_LOGS_ENABLED=true
     - DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL=true
     - DD_AC_EXCLUDE="name:datadog-agent"
    volumes:
     - /var/run/docker.sock:/var/run/docker.sock:ro
     - /proc/:/host/proc/:ro
     - /sys/fs/cgroup/:/host/sys/fs/cgroup:ro
     - /opt/datadog-agent/run:/opt/datadog-agent/run:rw

答案 1 :(得分:1)

使用Array.prototype.someArray.prototype.indexOf

制作第一个数组的副本,然后遍历第二个数组的元素,然后在第一个数组中查找该元素(如果找到),将其删除,这样就不会被计算在内。

const missing = (arr1, arr2) => {
  const left = [...arr1];
  return arr2.some(x => {
    const idx = left.indexOf(x);
    if (idx >= 0) left.splice(idx, 1);
    return idx < 0;
  });
}
  
console.log(missing(['bob', 'george'], ['bob', 'george', 'frank'])); // true
console.log(missing(['bob', 'frank'], ['bob', 'george', 'frank'])); // true
console.log(missing(['frank', 'george'], ['bob', 'george', 'frank'])); // true
console.log(missing(['frank', 'bob', 'george'], ['bob', 'george', 'frank'])); // false
console.log(missing(['frank', 'george', 'sue', 'frank'], ['bob', 'george', 'frank']));  // true
console.log(missing(['frank', 'george', 'sue', 'frank'], ['bob', 'george', 'frank', 'janet'])); // true
console.log(missing(['frank', 'george'], ['frank', 'frank'])); // false

答案 2 :(得分:1)

我很难理解您希望倒数第二次测试是假的,但是您好像更新了它

console.log(missing(['bob', 'george'], ['bob', 'george', 'frank']) === true);
console.log(missing(['bob', 'frank'], ['bob', 'george', 'frank']) === true); 
console.log(missing(['frank', 'george'], ['bob', 'george', 'frank']) === true);
console.log(missing(['frank', 'bob', 'george'], ['bob', 'george', 'frank']) === false); 
console.log(missing(['frank', 'george', 'sue', 'frank'], ['bob', 'george', 'frank']) === true);
console.log(missing(['frank', 'george', 'sue', 'frank'], ['bob', 'george', 'frank', 'janet']) === true);
console.log(missing(['frank', 'george'], ['frank', 'frank']) === true);

function missing(a, b) {
  var c = [].concat(a); // non-destructive
  for (var i = 0; i < b.length; i++) {
    var iO = c.indexOf(b[i]);
    if (iO < 0) {
      return true;
    }
    c.splice(iO, 1)
  }
  return false;
}

该函数,因为您只关心数组b中没有的内容,因此遍历b并与数组a比较,一旦找到丢失的项,则立即返回true 否则最后返回false

已更新以跟踪计数

答案 3 :(得分:0)

找到第二个数组中的第一个元素并将其删除。

function missing(a,b) {
  let coppied = [...b];
  a.forEach(el => {
    const index = coppied.indexOf(el);
    if (index != -1) {
      coppied.splice(index, 1);
    }
  });

  return !!coppied.length; //If not empty return true
}

答案 4 :(得分:0)

function missing(a,b){
  //remove duplicated elements
  var aa=a.filter(function(elem, index, self) {return index ===self.indexOf(elem);});
  var bb=b.filter(function(elem, index, self) {return index ===self.indexOf(elem);});
  //put in aa the longest array
  if(aa.length<bb.length){
    var tmp=aa;
    aa=bb;
    bb=tmp;
  }
  var result=false;
  //search for an aa's element not in bb
  aa.forEach(el=>{
    if(bb.indexOf(el)<0){
      result=true;
      return;
    }
  });
  return result;
}

var array1 = ['bob', 'george'];
var array2 = ['bob', 'george', 'frank']; // result:true, expected: true
console.log(missing(array2, array1));

var array1 = ['bob', 'frank'];
var array2 = ['bob', 'george', 'frank']; // result:true, expected: true
console.log(missing(array2, array1));

var array1 = ['frank', 'george'];
var array2 = ['bob', 'george', 'frank']; // result:true, expected: true
console.log(missing(array2, array1));

var array1 = ['frank', 'bob', 'george'];
var array2 = ['bob', 'george', 'frank']; // result:false, expected: false
console.log(missing(array2, array1));

var array1 = ['frank', 'george', 'sue', 'frank'];
var array2 = ['bob', 'george', 'frank'];  // result:false, expected: true
console.log(missing(array2, array1));

array1 = ['frank', 'george', 'sue', 'frank'];
array2 = ['bob', 'george', 'frank', 'janet'];  // result:false, expected:true
console.log(missing(array2, array1));