2016-05-04 23 views
1

Ich arbeite eine Parsing-Komponente, um den String-Wert zu einer Zeichenfolge für ein Objekt zu analysieren.JavaScript eine Zeichenfolge zu Objekt analysieren

dachte ich einen Weg, dies zu tun ist substr() mehrmals aufrufen, aber wenn es eine Möglichkeit, es besser zu machen?

Zum Beispiel, wenn ich Eingabe der Zeichenfolge

USER='Howe', TEXT='foo' 

oder

USER='HOWE' TEXT='foo' 

oder

USER='HOWE',TEXT='foo' 

Nach der Funktion würde ein Objekt wie folgt sein:

{USER:'HOWE, TEXT='foo'}; 
+0

Ich bin etwas verwirrt. Wollen Sie sagen, dass Sie mehrere Vorkommen von 'USER' und' TEXT' in einem Array von Objekten für jede Gruppe gruppieren wollen?also 'USER = 'HOWE', TEXT = 'foo', USER = '2', TEXT = '3' 'wäre' [{USER:' HOWE ', TEXT:' foo '}, {USER:' 2 ' , TEXT: '3'}] ' – ste2425

+0

Können Sie darüber klären? Möchten Sie mit array.push (string) eine Zeichenfolge zu einem Array hinzufügen; oder ändern Sie den Wert eines Eintrags in einem Objekt mit object.property = string; ? – Iblob

+0

Sorry Leute, editieren Sie einfach die Frage, ich möchte eine Zeichenfolge zu einem Objekt mit Index und Eigenschaft analysieren, danke. @ ste2425 –

Antwort

2

von my previous answer überarbeitet.

function toObj(str) { 
    const a = str.split(/[,\s]+/); 
    return a.reduce((p, c) => { 
    const kv = c.replace(/'/g, '').split('='); 
    p[kv[0]] = kv[1]; 
    return p; 
    }, {}); 
} 

toObj("USER='Howe', TEXT='foo'"); // { USER: "Howe", TEXT: "foo" } 
toObj("USER='Howe',TEXT='foo'"); // { USER: "Howe", TEXT: "foo" } 
toObj("USER='Howe' TEXT='foo'"); // { USER: "Howe", TEXT: "foo" } 

DEMO

+0

Vielen Dank, das ist eine gute Lösung –

-1

Wenn Sie wirklich wollen einfach nur auf ein Array diese beiden Werte in Split Sie so etwas wie tun könnte:

str.split(','); 

Aber es klingt eigentlich so, als ob Sie es zu einem Objekt mit Schlüssel, Wertpaaren und gar keinem Array ändern wollen.

Können Sie genauer sein? Was ist die genaue Zeichenfolge, die Sie analysieren möchten?

+0

Ich habe gerade aktualisiert die Frage, was ich will, ist die Zeichenfolge zu einem Objekt mit Index und Schlüssel zu analysieren, vielen Dank –

1

Das ist nicht recht gültige Objekt-Syntax für JSON. Man könnte es wie folgt tun:

var text = '{ "USER":"Howe", "TEXT":"foo" }'; 
var obj = JSON.parse(text); 
console.log(text, obj); 

Dann können Sie einfach auf die Eigenschaften über obj.USER und obj.TEXT beziehen.

EDITED: Nach Diskussion ...

ich so etwas wie das folgende tun würde vorschlagen, wenn Sie Benutzern die Möglichkeit geben möchten, auf zwei Feldern suchen (Sie dies für so viele Felder erstrecken, wie Sie wünschen, natürlich).

<script> 
function search() { 
    var userValue = document.getElementById('txtUser').value; 
    var textValue = document.getElementById('txtText').value; 
    var jsonText = '{ "USER":"' + userValue + '", "TEXT":"' + textValue + '" }'; 
    console.log(jsonText); 
    var json = JSON.parse(jsonText); 
    console.log(json); 

    // Do whatever you wish with your created object here... 
} 
</script> 

<input id="txtUser" value="foo" type="text"> 
<input id="txtText" value="bar" type="text"> 
<button onclick="search();">Submit</button> 
+0

Nun, die Zeichenfolge ist eigentlich für einen Benutzer, um die Suchfunktion zu tun. Also erwarte ich nicht, dass ein Benutzer eine solche Syntax wie die JSON-Syntax eingibt. –

+1

Alles, was Sie dann brauchen, ist, die Werte vom Benutzer zu nehmen und den JSON-Text selbst zu konstruieren. Lassen Sie Ihre Nutzer keinen Text eingeben. Zwei Textfelder, greifen Sie auf die Werte, konstruieren Sie den JSON-Text, parsen Sie es, Job fertig :) – ManoDestra

+0

Nun, die Sache ist, ich bin ein Suchmodul für meine Web-App implementieren, und es gibt eine Suchleiste genau wie Twitter, und ich möchte Unterstützen Sie eine erweiterte Suchfunktion .. Deshalb stelle ich diese Frage .. Ich weiß, dass Ihr Vorschlag eine bessere Lösung ist .. Aber ich bin kein erfahrener JavaScript-Programmierer, also .. –

0

Sie können einen regulären Ausdruck verwenden, um die Schlüssel und Werte aus der Eingabezeichenfolge parsen:

function convert(s) { 
    var m = s.match(/USER='(.*)'.*TEXT='(.*)'/); 
    return { 
    USER: m[1], 
    TEXT: m[2] 
    } 
} 

console.log(convert("USER='HOWE' TEXT='foo'")); 

Der match Ausdruck verwendet Gruppierung (die „Übereinstimmungen“ in Klammern Einwickeln) die Werte erfassen , die dann im m Array enden.

Die Funktion convert gibt ein JavaScript-Objekt zurück. Wenn Sie das in eine JSON-Zeichenfolge umwandeln möchten, verwenden Sie JSON.parse.

JSBin: https://jsbin.com/fefufehibo/edit?js,console

Verwandte Themen