2016-08-04 7 views
0

Ich lade JSON-Datei aus der Datenbank mit zwei Feldern Wörter und Note. Jedes Wort wird zum Beispiel mit 1 bewertet, während lüge -1 hat. Dann nehme ich die Eingabe aus dem Textfeld und ich muss sie anhand von Noten aus der JSON-Datei benoten und dann den Punktestand berechnen, indem ich die Noten zusammenfasse, aber ich kann einfach nicht den Weg finden, dies zu tun. Wörter, die nicht in der Datei enthalten sind, werden nicht berechnet.Mehrere Wörter Such-und Berechnungsalgorithmus (Angular/Javascript)

Ich versuchte string.search match, aber es ist zu kompliziert und am Ende konnte ich nicht Ergebnis wie ich wollte. Ich habe versucht Array-Suche gleiche Sache. Ich suchte nach Online-Lösung, aber niemand hat etwas Ähnliches getan, also kann ich es nicht kopieren.

JSON

[ 
    {"word":"true","grade":1}, 
    {"word":"hate","grade":-1}, 
    {"word":"dog","grade":0.8}, 
    {"word":"cat","grade":-0.8}  
] 

String

"Hunde sind wunderbar, aber ich ziehe es Katzen, Katzen, ich nicht lügen kann, obwohl Hund ein wahrer Freund ist".

+0

helfen würde u zeigen So könnte, wie weit Ihr versucht haben? Die Logik ist nicht so kompliziert. Ich denke nicht, dass es notwendig ist, einen ** Algorithmus ** zu haben, wenn Komplexität kein großes Problem ist. – MMhunter

+0

Ihr JSON ist ungültig. Überprüfen Sie http://jsonlint.com/ –

+0

@IvanSivak ist richtig. Es sollte mit '[]' und nicht mit '{}' gehüllt werden. – FDavidov

Antwort

0

Das erste, was ich tun würde, ist Ihre JSON-Daten in eine Karte drehen, die leicht durchsucht werden können - Taste das Wort wäre, und den Wert der Note:

var json = [ 
 
    {"word":"true","grade":1}, 
 
    {"word":"hate","grade":-1}, 
 
    {"word":"dog","grade":0.8}, 
 
    {"word":"cat","grade":-0.8}  
 
    ]; 
 

 
var map = json.reduce(function(p,c){ 
 
    p.set(c.word.toLowerCase(),c.grade); 
 
    return p; 
 
}, new Map()); 
 

 
console.log(...map);

Dann , es ist nur ein Fall der Zeichenfolge zu spalten, während auch die Gesamtscore Berechnung - wieder kann reduce

var json = [ 
 
     {"word":"true","grade":1}, 
 
     {"word":"hate","grade":-1}, 
 
     {"word":"dog","grade":0.8}, 
 
     {"word":"cat","grade":-0.8}  
 
     ]; 
 

 
    var map = json.reduce(function(p,c){ 
 
     p.set(c.word.toLowerCase(),c.grade); 
 
     return p; 
 
    }, new Map()); 
 

 
var input = "Dogs are wonderful but i prefer cats cats i can not lie although dog is a true friend"; 
 

 
var score = input.split(' ').reduce(function(p,c){ 
 
    var wordScore = map.get(c.toLowerCase()) || 0; 
 
    return p + wordScore; 
 
},0); 
 

 
console.log(score);
0 verwendet werden

Beachten Sie, dass ich Interpunktion in der obigen Eingabe manuell entfernt habe - ich überlasse das als Übung für Sie.

Beachten Sie auch, dass "cats" != "cat" so einige Ihrer Wörter nicht gefunden werden!

+0

Sie sind Genie, das ist perfekt, ich habe Karten nie benutzt und ich weiß nicht, wie man sie so benutzt Das ist die zweite Übung, die ich machen muss. Ich werde sehen, wie es funktioniert und die Interpunktion zu entfernen sollte mein Job sein! Vielen Dank ... wirklich, ich habe mir seit Tagen den Kopf mit diesen Sachen gebrochen. –

+0

Wenn ich möchte, dass Katzen gefunden werden, was muss ich hinzufügen? Nur neugierig –

+0

@AbsoluteBeginer - Sie könnten eine ['StartsWith'] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith) verwenden, oder Sie könnten ändern, um eine Regex zu verwenden Muster ähnlich der anderen Antwort. Es hängt alles davon ab, wie Ihre Punktzahl funktioniert! Sie werden feststellen, dass ich bereits mit der Groß-/Kleinschreibung umgehen musste, indem Sie 'toLowerCase()' sowohl für die Wortergebniskarte als auch für die Eingabeverarbeitung verwendeten. – Jamiec

0

Denken wir zuerst an den Algorithmus. Zwei Optionen:

  1. Suchen und Zählen der Eingabezeichenfolge so oft wie Anzahl der Worte in Ihrem JSON oder
  2. prüfen jedes Wort in der Eingabezeichenfolge gegen den JSON Inhalt.

Da die JSON Länge bekannt ist und (nehme ich an), die kürzer als das mögliche Eingabestring, würde ich dazu neigen, Option 2.

nun bevorzugen, nach Auswahl der Option 2, müssen Sie den Eingabestring spalten in Worte fassen und ein Array erstellen, das für jeden Eintrag des Arrays ein Wort enthält.

Sie können dies unter Verwendung der mystring.split(" ") Methode erreichen. Dies berücksichtigt natürlich keine Interpunktionen, aber Sie können dies mit der gleichen Methode handhaben.

Jetzt können Sie jedem Eintrag in Ihrem JSON ein Feld hinzufügen, um die Anzahl der Erscheinungsbilder jedes Eintrags im JSON innerhalb der Zeichenfolge zu zählen.

Schließlich summieren Sie das Produkt der Zähler und der Klasse.

+0

Interpunktion kann vor der Berechnung entfernt werden, so wird es einfacher. Scheint eine gute Idee und ich dachte, dass ich laut, aber ich weiß nicht, wie es in Code zu tun :( –

+0

Nun, ich habe kein ** bereit ** Beispiel und kann nicht den Code schreiben und testen, aber kann Geben Sie einige Richtlinien ein: Ersetzen Sie als erstes alle Interpunktionen durch Leerzeichen, ersetzen Sie alle doppelten Leerzeichen durch eine einzige, und teilen Sie die Zeichenfolge wie folgt auf: var words_array = instring.split (""); , das Äußere über die Länge des Arrays 'words_array' von' 0' nach 'words_arrray.length', während die innere Schleife von' 0' nach 'known_words.length' wechselt, innerhalb der inneren Schleife, vergleiche die Einträge und füge eins hinzu – FDavidov

+0

Eine Klarstellung: In jedem Zyklus der äußeren Schleife müssen Sie dem JSON der bekannten Wörter ein Element hinzufügen, etwa so: 'known_words [k] .count = 0' wobei' k' der Index ist von der äußeren Schleife – FDavidov

0

console.log((function(rules, str) { 
 
    var sum = 0; 
 
    Array.prototype.forEach.call(rules, function(rule) { 
 
    var match = str.match(rule.regexp); 
 
    
 
    match && (sum += str.match(rule.regexp).length * rule.grade); 
 
    console.log([rule.regexp, match&&match.length, rule.grade, match&&match.length * rule.grade, sum]); 
 
    }); 
 
    return sum; 
 
})([{ 
 
    "regexp": /true/g, 
 
    "grade": 1 
 
}, { 
 
    "regexp": /hate/g, 
 
    "grade": -1 
 
}, { 
 
    "regexp": /dog/g, 
 
    "grade": 0.8 
 
}, { 
 
    "regexp": /cat/g, 
 
    "grade": -0.8 
 
}], "Dogs are wonderful but i prefer cats, cats, i can not lie although dog is a true friend"));

i regexp eher verwenden als Zeichenfolge, u Zeichenfolge verwenden können und konvertieren zur Laufzeit regex, hoffen, dass diese