2017-07-08 1 views
0

Ceci est mon premier article, j'ai fait des recherches mais je ne suis pas sûr que je pose la question de la bonne façon dans les recherches.Object.keys retournant comme non égal

Je tente de comparer les clés d'un objet aux clés d'un autre objet (c'est pour les algorithmes freeCodeCamp). Mon code est ci-dessous:

function whereAreYou(collection, source) { 
    var arr = []; 
    for (var i=0;i<collection.length;i++) { 
    console.log("Object.keys(source)= " + Object.keys(source)); 
    console.log("Object.keys(collection[" +i + "]))= " + Object.keys(collection[i])); 
    console.log("collection[" +i + "].hasOwnProperty(Object.keys(source))= " + collection[i].hasOwnProperty(Object.keys(source))); 
    if (collection[i].hasOwnProperty(Object.keys(source))) { 
     var prop = Object.keys(source); 
     console.log("prop=" + prop); 
     console.log("collection[" +i + "][prop]= " + collection[i][prop]); 
     console.log("source[prop]= " + source[prop]); 
     if (collection[i][prop] === source[prop]) { 
     arr.push(collection[i]); 
     } 
    } 
    } 
    return arr; 
} 

Quand il y a plusieurs clés dans l'argument source, les

if (collection[i].hasOwnProperty(Object.keys(source))) 

renvoie false même si la collecte [i] ne contient les clés comme ci-dessous.

whereAreYou([{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }], { "a": 1, "b": 2 }) 

Object.keys(source)= a,b 
Object.keys(collection[0]))= a,b 
collection[0].hasOwnProperty(Object.keys(source))= false 
Object.keys(source)= a,b 
Object.keys(collection[1]))= a 
collection[1].hasOwnProperty(Object.keys(source))= false 
Object.keys(source)= a,b 
Object.keys(collection[2]))= a,b,c 
collection[2].hasOwnProperty(Object.keys(source))= false 
[] 

Ma question est pourquoi ne sont pas a, b et a, b égal? Merci pour votre temps!

+0

Merci beaucoup d'avoir pris le temps de m'aider! J'ai trouvé une meilleure façon de résoudre l'algorithme avant de poster ceci, j'imagine que j'aurais dû être plus clair sur cette partie. Je suis en train de comprendre pourquoi la collecte [0] .hasOwnProperty (Object.keys (source)) est égal à faux dans ce qui précède où la collecte [0] et Object.keys (source) sont égales à un, b. – Will

+0

Étant donné que 'OuEsTuMaintenant ([{ "a": 1}, { "a": 1}, { "a": 1, "b": 2}], { "a": 1}) objet. keys (source) = a Object.keys (collection [0])) = a collection [0] .hasOwnProperty (Object.keys (source)) = true Object.keys (source) = a Object.keys (collection [1])) = a collection [1] .hasOwnProperty (Object.keys (source)) = true Object.keys (source) = a Object.keys (collection [2])) = a, b collection [2] .hasOwnProperty (Object.keys (source)) = true [] ' Pourquoi a, b ne renvoie-t-il pas true? – Will

Répondre

0

FreeCodeCamp est génial. Si c'est une question spécifique à une formation qu'ils ont, leurs forums sont généralement un bon débouché. Ils en sauront plus sur ce que vous demandez et sur ce qui s'y rapporte. Cependant, si vous essayez simplement de comparer des objets, cela semble assez verbeux.

Jetez un coup d'œil à d'autres articles sur la pile pour voir, voici quelques liens qui aident à comprendre la comparaison d'objets. Object comparison in JavaScript

De MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness

0

Je ne suis pas sûr que hasOwnProperty est ce que vous voulez. Consultez la définition de hasOwnProperty: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

Vous devez comparer les éléments de chaque matrice. Par exemple, sur la première itération:

Object.keys(collection[i]).includes("a") // true 
Object.keys(collection[i]).includes("b") // true 
Object.keys(collection[i]).includes(Object.keys(source)[0]) // true 
Object.keys(collection[i]).includes(Object.keys(source)[1]) // true 

Vous pouvez itérer sur Object.keys(source) et le comparer à Object.keys(collection[i]), ou essayer quelque chose de plus court, voir: Determining whether one array contains the contents of another array in JavaScript/CoffeeScript

Vous pouvez faire quelque chose comme ceci:

function whereAreYou(collection, source) { 
    var arr = []; 
    for (var i = 0; i < collection.length; i++) { 
     for (var j = 0; j < Object.keys(source).length; j++) { 
      if (Object.keys(collection[i]).includes(Object.keys(source)[j])) { 
       // do your comparisons here 
      } 
     } 
    } 
    return arr; 
}