2016-06-01 4 views
0

Ich habe ein Objekt Category genannt, die ein Verfahren verwendet eine Reihe von Produkten (Product) iterieren und eine Instanz zurück, die die this.name === query Bedingung erfüllt: Meinein Objekt in .each Iteration zurückkehrend - JavaScript

function Category(products){ 
    this.products = products; 
    this.findProductByName = function(query){ 
    $(this.products).each(function(){ 
     return this.name === query; 
    } 
    } 
} 

Product (für alle Fälle):

function Product(name){ 
    this.name = name; 
} 

ich eine Instanz von Category mit Produkten erstellen Sie dann:

var $someCategory = new Category(
    [ 
     new Product('foo'), 
     new Product('bar') 
    ] 
)` 

und wenn ich rufe:

$someCategory.findProductByName('foo'); // 'undefined' 

obwohl:

... 
this.findProductByName = function(query){ 
    $(this.products).each(function(){ 
    console.log(this.name === query); // returns 'true' 
    } 
} 
... 

Was kann ich tun, um ein Objekt zurückzugeben, wenn this.name === query erfüllt ist?

+2

Der Mechanismus '$ .each()' ignoriert die zurückgegebenen Werte (meist). Was erwarten Sie von ihm? – Pointy

+1

Verwenden Sie [] .filter() und [] .map() anstelle von jedem() – dandavis

+0

@Pointy gibt die richtige 'Product' -Instanz zurück, wenn die Bedingung erfüllt ist, so dass ich nach '$ someCategory' nach Produkten suchen kann . Was meinst du mit "ignoriert die zurückgegebenen Werte"? –

Antwort

1

Sie müssen eine herkömmliche Schleife mit einer Rückgabe (oder Karte/reduzieren) verwenden, damit Ihre Funktion das übereinstimmende Ergebnis zurückgibt. Die einzelnen Funktionen führen für jedes Element im Array eine Operation aus, führen keine Filterung durch und ignorieren den zurückgegebenen Wert.

Try this:

this.findProductByName = function(query) { 
    for (var i = 0; i < this.products.length; i++) { 
    if (this.products[i].name === query) 
    { 
     return this.products[i]; 
    } 
    } 
} 

Auch FYI, Es ist normal, Argumente in die each() Funktion zu übergeben, die das aktuelle Element identifizieren wird iteriert, wenn diese mit dem Umfang Thema für 'this'

$(this.products).each(function(index, value) { 
    alert(index + ": " + value); 
}); 
hilft beseitigen
+0

Schön! Vielen Dank! Frage: Warum also 'everly' überhaupt verwenden, wenn die 'for-Schleife' die Iteration bereits behandelt und Vals zurückgibt? –

+1

Es ist syntaktische Nettigkeit für, wenn Sie explizit eine Operation für jedes Element im Array ausführen möchten, dh ein Präfix zur Namenseigenschaft hinzufügen: $ (this.products) .each (function (i, el) {el.name = "Mein" + el.name;}); –

+1

Auch einige Leute lieben nur jquery über natives Javascript. –

2

Müssen Sie jQuery verwenden? Können Sie stattdessen die Array-Filter-Methode ...

function Category(products){ 
    this.products = products; 
    this.findProductByName = function(query){ 
    return this.products.filter(function(item){ 
     return item.name === query; 
    }); 
    }; 
}