2016-04-21 22 views
0

Ich arbeite an der Implementierung einer Histogrammfunktion für Arrays, um ein Objekt zurückzugeben, das zählt, wie oft ein Element in diesem Array angezeigt wird. Immer, wenn ich diesen Code ausführe, bekomme ich eine Fehlermeldung, die darauf hinweist, dass der "in" -Operator nicht zum Suchen innerhalb des Objekts verwendet werden kann.Was ist der richtige Weg, um den "in" -Operator zu verwenden, um ein Histogramm zu erstellen?

var histogram = function(collection) { 
    collection.reduce(function(combine, item){ 
    if(item in combine){ 
    combine[item]++; 
    } else{ 
    combine[item] = 1; 
    } 
    }, {}); 
} 
var arr = "racecar".split(""); 
console.log(hist(arr)); 

Ich vermute das Problem hier verursacht entweder durch oder reduzieren, aber ich kann nicht herausfinden, was es ist. Irgendwelche Ideen?

+0

Wahrscheinlich möchten Sie [in operator] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in) vermeiden, da es möglicherweise nicht Ihren Erwartungen entspricht. –

Antwort

0

Ein paar Dinge: 1) hist ist nicht der Funktionsname, 2) Sie geben nichts von der Funktion zurück. Ich bin mir nicht sicher, wie Sie diesen Fehler bekommen, wenn Sie nicht einmal die Funktion richtig aufrufen, und etwas, vor dem das Konsolenprotokoll Sie gewarnt hätte.

var histogram = function(collection) { 
    return collection.reduce(function(combine, item) { 
    if (item in combine) { 
     combine[item]++; 
    } else { 
     combine[item] = 1; 
    } 
    return combine; 
    }, {}); 
} 

DEMO

Hier ist eine kürzere Version, die nicht auf die Verwendung von in angewiesen:

var histogram = function(collection) { 
    return collection.reduce(function (combine, item) { 
    combine[item] = (combine[item] || 0) + 1; 
    return combine; 
    }, {}); 
} 

DEMO

+1

Danke Andy! Ich kann nicht glauben, dass ich zwei Return-Statements weggelassen habe, die das beheben. Ich glaube, ich wurde von einer Fehlermeldung abgewimmelt, die meine Aufmerksamkeit in die falsche Richtung lenkte. –

0

Das Problem mit inoperator ist, dass es nicht nur sucht in Array-Indizes, aber auch in allen geerbten Eigenschaften eines Array-Objekts.

Bei Verwendung in einem falschen Kontext (Suche nach Indizes in einem Array) kann es zu Problemen führen, die später schwer zu debuggen sind.

In Ihrem Fall verwenden Sie am besten Array.prototype.indexOf() oder Array.prototype.includes() (von ES6).

Verwandte Themen