0
votes

Essayer de détecter si un tableau manque des éléments d'un autre

J'ai le code suivant qui compare Array1 à Array2 afin de déterminer si Array1 manque une valeur de Array2: xxx pré>

Ce qui précède ne fonctionne pas toujours. Voir ci-dessous graphique pour scénarios et résultats VS Résultats attendus: P>

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


1 commentaires

@Certeperformance Parce que si quelque chose manque, cela devrait dire vrai, pas faux, comme c'est le cas dans tous les autres exemples.


5 Réponses :


2
votes

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))


5 commentaires

@Sweepster Scénario 5 Misses 'Bob'


Si le tableau 1 contient 'Frank', 'George' et Array2 contiennent "Frank", le résultat attendu "Frank 'devrait être vrai. Je deviens faux.


Vous avez répondu devant moi cependant, s'il s'agit de la bonne réponse, le vôtre devrait être accepté


mais le 2e Frank in Array 2 est absent de la graphique 1, le résultat devrait donc être vrai


@Sweepster vérifier



0
votes

Trouvez le premier élément dans la deuxième matrice et retirez-le.

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
}


2 commentaires

Cela n'aide pas quand il y a des valeurs répétées. Si un tableau a deux de la même valeur, la seconde devrait également avoir 2 ...


Vérifiez-le maintenant.



1
votes

10 commentaires

@Sweepster, je vois que vous avez mis à jour votre question, ma réponse devrait fonctionner


@JO_VA Nos réponses sont les mêmes


Si le tableau 1 contient 'Frank', 'George' et Array2 contiennent "Frank", "Frank '," Frank' Résultat devrait être vrai car le 2e Frank manque dans la matrice 1. Je deviens faux.


@Sweepster ok, attends


@jo_va tu rigoles? Ah ah


@ALexowl, haha, pas du tout, je viens de voir que vous avez mis à jour votre code lorsque vous avez posté ce commentaire


@jo_va est-ce que ça va d'épisser (-1, 1)?


@Alexowl, je pense que vous connaissez la réponse, non ce n'est pas le cas, haha, il va supprimer à la fin


@Jo_VA Essayez d'exécuter votre extrait, vous avez cassé quelque chose


@Anexown, eh bien, j'ai foiré en effet!



0
votes

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 commentaires

1
votes

J'avais du mal à comprendre comment vous vouliez que le deuxième dernier test soit faux, mais on dirait que vous l'avez mis à jour

p>

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;
}


3 commentaires

Yah, désolé pour ça.


Si le tableau 1 contient "Frank", "George" et Array2 contient "Frank", "Frank", le résultat attendu devrait être vrai car le 2e Frank est manquant. Je deviens faux.


OK, cela change un peu les choses, car cela signifie que vous devez garder le nombre d'articles manquants