Попытка обнаружить, если в одном массиве отсутствуют элементы другого - PullRequest
0 голосов
/ 14 марта 2019

У меня есть следующий код, который сравнивает массив1 с массивом2, чтобы определить, не содержит ли массив1 значение из массива2:

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

Я не уверен, в чем проблема ...

Я прочитал эту тему но это не приносит мне никакого плода, так как мне не нужно знать, какой элемент отсутствует, мне просто нужно знать, отсутствует ли какой-либо один элемент.

Пожалуйста, никаких внешних библиотек.спасибо.

Ответы [ 5 ]

2 голосов
/ 14 марта 2019

function missing(array1, array2) {
  const copy = array1.slice()
  return array2.some(element => {
    const index = copy.indexOf(element)
    if(index >= 0) copy.splice(index, 1);
    return index < 0
  })
}


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

console.log(missing(array1, array2))

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

console.log(missing(array1, array2))

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

console.log(missing(array1, array2))

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

console.log(missing(array1, array2))

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

console.log(missing(array1, array2))

var array1 = ['frank', 'george', 'sue', 'frank'];
var array2 = ['bob', 'george', 'frank', 'janet'];
console.log(missing(array1, array2))

var array1 = ['frank', 'george'];
var array2 = ['frank', 'frank'];
console.log(missing(array1, array2))
1 голос
/ 14 марта 2019

Мне было трудно понять, как вы хотели, чтобы второй последний тест был ложным, но похоже, что вы обновили его

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 в конце

обновлено, чтобы отслеживать количество

1 голос
/ 14 марта 2019

Используйте Array.prototype.some и Array.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
0 голосов
/ 14 марта 2019

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));
0 голосов
/ 14 марта 2019

Найти первый элемент во втором массиве и удалить его.

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...