2
votes

Renvoie les clés et les valeurs de l'objet lors de la correspondance avec l'argument

Le but est de construire une fonction, qui prend un tableau d'objets comme premiers arguments. Comme deuxième argument, il prend une paire clé et valeur.

 function whatIsInAName(collection, source)

La fonction doit maintenant renvoyer un tableau avec toutes les clés et valeurs correspondantes de l'objet. Par exemple:

if (collection[i] === source)

doit renvoyer

[{first: "Tybalt", last: "Capulet"}]

Et

function whatIsInAName(collection, source) {
  // What's in a name?
  var arr = [];
  for (var i = 0; i < Object.keys(collection).length; i++) {
    for (var j = 0; j < Object.keys(source).length; j++) {
      if (collection[i].last === source.last) {
        arr.push(collection[i]);
      }
    }
  }
  console.log(arr);
}

devrait retourner

 [{ "apple": 1, "bat": 2 }, { "apple": 1, "bat": 2, "cookie": 2 }]

J'ai essayé de parcourir la collection et la source tableau recherchant des correspondances. Comme ceci:

whatIsInAName([{ "apple": 1, "bat": 2 }, { "bat": 2 }, { "apple": 1, "bat": 2, "cookie": 2 }], { "apple": 1, "bat": 2 })

Et dans le cas de ces arguments whatIsInAName ([{first: "Romeo", last: "Montague"}, {first: "Mercutio" , last: null}, {first: "Tybalt", last: "Capulet"}], {last: "Capulet"})

Cela fonctionne sans surprise.

Ce que je ne comprends pas, c'est pourquoi je ne peux pas généraliser la solution ci-dessus, afin qu'elle fonctionne également dans d'autres cas.

Pourquoi n'est-il pas possible de donnez simplement la condition:

whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" })´ 

(Veuillez noter la clé manquante " Last" derrière la collection et la source.)

Lorsque je console.log (source) , la console le consigne. Donc, à mon humble avis, l'instruction conditionnelle ci-dessus devrait fonctionner et devrait pousser les correspondances dans le tableau arr .

Comment puis-je créer une fonction qui renvoie un tableau avec toutes les clés et valeurs correspondantes de l'objet.

function whatIsInAName(collection, source)

Et pourquoi (collection [i] === source ) ne fonctionne pas?

Merci.


1 commentaires

Deux objets ne sont === que s'ils sont la même référence à un objet.


3 Réponses :


1
votes

Vous pouvez utiliser le filtre et tous les fichiers. Par objet. Alors ici l'idée est

  1. Utilisez un filtre sur input arg pour obtenir l'élément souhaité en sortie.
  2. Dans le rappel du filtre par Object.keys , nous retirons la clé de matchObj arg et pour chaque clé, nous faisons correspondre la valeur de l'élément avec la valeur que nous obtenons dans matchObj arg et filtrez en conséquence.

console.log(whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" }))

function whatIsInAName(input,matchObj){
  return input.filter(e=> Object.keys(matchObj).every(el=> e[el] === matchObj[el]))
}


0 commentaires

2
votes

Vous devez itérer les paires clé / valeur et renvoyer un résultat filtré.

En fait, il n'y a pas de méthode intégrée pour tester un objet par rapport à un autre pour vérifier si l'objet contient un sous-objet.

.as-console-wrapper { max-height: 100% !important; top: 0; }
function whatIsInAName(collection, source) {
    var pairs = Object.entries(source);
    return collection.filter(object => pairs.every(([key, value]) => object[key] === value));
}

console.log(whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" }));
console.log(whatIsInAName([{ "apple": 1, "bat": 2 }, { "bat": 2 }, { "apple": 1, "bat": 2, "cookie": 2 }], { "apple": 1, "bat": 2 }));


0 commentaires

1
votes

Premièrement:

Pourquoi n'est-il pas possible de donner simplement la condition: if (collection [i] === source)

Comme les objets sont comparés par des valeurs de référence, ce sont deux objets différents, donc leurs références sont distinctes.

Maintenant, vous pouvez corriger votre logique avec quelque chose comme ceci:

function whatIsInAName(collection, source)
{
  // What's in a name?

  var arr = [], sourceKeys = Object.keys(source);
  var toPush, key;

  // Iterate over the collection of input objects.

  for (var i = 0; i < collection.length; i++)
  {
    toPush = true;

    // Check if current analyzed object have all
    // required (key, value) pairs.

    for (var j = 0; j < sourceKeys.length; j++)
    {
      key = sourceKeys[j];

      if (!collection[i][key] || collection[i][key] !== source[key])
      {
        toPush = false;
        break;
      }
    }

    // If current object meet the condition, put it on the
    // result array.

    if (toPush)
      arr.push(collection[i]);
  }

  return arr;
}

let input1 = [
  {first: "Romeo", last: "Montague"},
  {first: "Mercutio", last: null},
  {first: "Tybalt", last: "Capulet"}
];

console.log(whatIsInAName(input1, {last: "Capulet"}));

let input2 = [
  {"apple": 1, "bat": 2},
  {"bat": 2},
  {"apple": 1, "bat": 2, "cookie": 2}
];

console.log(whatIsInAName(input2, {"apple": 1, "bat": 2}));


0 commentaires