2016-11-25 6 views
2

Also mache ich einige Herausforderungen auf Freecodecamp, ich blieb auf einer, der sagt: "Erstellen Sie eine Funktion, die durch ein Array von Objekten (erstes Argument) und gibt ein Array aller Objekte zurück mit übereinstimmenden Eigenschaften und Wertpaaren (zweites Argument). " So sah ich die für die Antwort und kam auf der anderen nächsten Code:Verstehen Rückgabewert einer Funktion

function whatIsInAName(collection, source) { 
    var arr = []; 
    var keys = Object.keys(source); 
    // Filter array and remove the ones that do not have the keys from source. 
    arr = collection.filter(function(obj) { 
    return keys.every(function(key) { 
     return obj.hasOwnProperty(key) && obj[key] === source[key]; 
    }); 
    }); 

    return arr; 
} 

Ich verstehe, was es tut, was ich kann nicht scheinen, um ist die Rückkehr in den collection.filter warum brauchen wir diese beiden:

return keys.every(function(key) { 
     return obj.hasOwnProperty(key) && obj[key] === source[key]; 

Warum der Code nicht nur mit dem zweiten funktioniert.

Kann mir jemand das bitte erklären.

+0

Es ohne 'hasOwnProperty' funktionieren könnte, aber wenn ein Vorfahre des Objekts hat Eigenschaften würden diese auch für das Kind in Betracht gezogen werden. –

+1

Weil Sie 'return' verwenden müssen, um einen Wert von einer Funktion zurückzugeben. Die erste Rückkehr kehrt von der Funktion zurück, die an "alle" übergeben wurde. Die zweite Rückkehr kommt von whatIsInAName zurück. – Carcigenicate

+0

Weitere Informationen zur Methode finden Sie unter https://developer.mozilla.org/nl/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty. –

Antwort

1

dieser Code:

arr = collection.filter(function(obj) { 
    return keys.every(function(key) { 
     return obj.hasOwnProperty(key) && obj[key] === source[key]; 
    }); 

Zuerst (dies ist die Haupt-Skript wheter Collection zu prüfen Element entspricht oder nicht mit der Quelle)

keys.every(function(key) { 
      return obj.hasOwnProperty(key) && obj[key] === source[key]; 

Es wird nur Rückgabe entweder wahr/falsch basierend auf obj.hasOwnProperty(key) && obj[key] === source[key]; Bedingung. Es prüft alle Schlüssel von source. Wenn es nur one key nicht übereinstimmend mit der Bedingung findet, unterbricht es die Schleife und gibt false zurück (bestanden alle Tests [alle Schlüssel und Werte von Quelle das gleiche mit dem Element der Sammlung]) zurück True.

dann

arr = collection.filter(function(obj) { return true // false

wenn es true zurückkehren, das Element obj von der Sammlung wird auf arr weitergegeben sonst filtered/skipped

0

collection.filter ruft Array.prototype.filter. Es wird zum Entfernen von Elementen aus einem Array verwendet, die bestimmte Kriterien nicht erfüllen. Die als Parameter übergebene Funktion wird verwendet, um festzustellen, ob ein Element diese Kriterien erfüllt. Ein Rückgabewert von false bedeutet, dass das Element aus dem Array entfernt werden sollte, während true bedeutet, dass das Element im Array bleiben soll. Wenn Sie der Funktion keine return Anweisung geben, gibt sie undefined für alle Elemente des Arrays zurück, was ein falscher Wert ist.

In ES6 können Sie arrow functions verwenden, die Sie nicht zu schreiben, benötigen return:

function whatIsInAName(collection, source) { 
    var keys = Object.keys(source); 
    return collection.filter(obj => 
    keys.every(key => 
     obj.hasOwnProperty(key) && obj[key] === source[key]; 
    ) 
); 
}