2017-06-12 2 views
1

Gegeben eine Schrägstrich getrennte URL wie http://www.example.com/some/fixed/path/param1/value1/param2/value2/param3/value3 Wie könnte ich ein Schlüssel/Wert-Objekt mit den dynamischen Parametern (param1/value, param2/value2 ...) dieser URL erstellen?Build Schlüssel/Wert Objekt von slash-separated URL

Gültige Parameter haben immer diesen Schrägstrich getrennt param und value Format und some/fixed/path wäre ein Teilstring manuell zur Verfügung gestellt.

Ich habe versucht, die vollständige URL (oder was immer es sein könnte) durch die feste Teilzeichenfolge zu teilen, und ich habe die dynamischen Params ausschneiden, wie ich wollte, aber ich konnte das Schlüssel/Wert-Objekt nicht wie benötigt erstellen :

var url = "http://www.example.com/some/fixed/path/param1/value1/param2/value2/param3/value3"; 
 

 
var uri = "some/fixed/path/"; 
 
var result = {}; 
 
url.split(uri).forEach(function(x){ 
 
    var arr = x.split('/'); 
 
    arr[1] && (result[arr[0]] = arr[1]); 
 
}); 
 
console.log(result);

Aber dieses Stück Code bringt mir nur das erste Paar statt alle von ihnen und es erfordert die uri zu obligat einen Schrägstrich hat. Wenn der Teilstring es nicht hat oder einen nach links hat, wirkt es alles komisch mit einem leeren Schlüssel und dem ersten Schlüssel als Wert o.O

Ich weiß, es ist einfach, aber ich kann es einfach nicht tun. Ich habe versucht zu suchen, aber das muss einen sehr spezifischen Weg haben, auf den ich mich beziehen kann, weil ich nicht selbst finden konnte.

Eine letzte Sache, wenn Sie nichts dagegen haben, zu erklären, anstatt nur geben Sie mir den Fisch, würde ich schätzen, so dass es kein nächstes Mal haben ... hoffentlich

+0

url.replace ("somefixedpath", ""). Split ("/").Filter (e => e); –

Antwort

2

Sie nur die einnahmen zweiter Teil nach some/fixed/path/. Sie müssen diesen zweiten Teil teilen und über das Array iterieren. Auf jedem geraden Index schaffe ich eine neue Eigenschaft in dem Objekt mit dem Namen des vorherigen Elements

x wird das aktuelle Element

i ist der aktuelle Index

a ist das Array enthält jedes Element nach dem Spaltung mit /

var url = "http://www.example.com/some/fixed/path/param1/value1/param2/value2/param3/value3"; 
 

 
var uri = "some/fixed/path/"; 
 
var result = {}; 
 
var paramsToSplit = url.split(uri)[1]; 
 
paramsToSplit.split('/').forEach((x,i,a)=>{ 
 
    if(i%2) 
 
    result[a[i-1]] = x; 
 
}); 
 
console.log(result);

+0

Können Sie mir sagen, warum Sie kein "else" brauchen? Wie auch immer, deine Lösung hat die gleiche Einschränkung, die ich bei meinem Versuch bemerkt habe. Der URI ** muss ** einen Schrägstrich enthalten. Kann ich darauf reagieren? Vielleicht alle Schrägstriche auf beiden Seiten entfernen und dann einen anhängen? – user5613506

+0

@ user5613506 else ist nicht erforderlich, da er mit 'a [i-1]' auf den vorherigen Wert zugreift. – Rajesh

+0

Ich brauche ein paar Optimierungen, wie das Entfernen vorhandener Schrägstriche und das Hinzufügen eines Schrägstrichs zum Ende, sowie einige Vorbehalte, wenn der feste Pfad nicht existiert (zB 'http://www.example.com/ param1/value1/param2/value2/param3/value3'), aber Ihre Lösung ist diejenige, die mehr Gelände abdeckt. Und du hast ein bisschen erklärt, wie ich gefragt habe :) – user5613506

0

Try this:

var url = "http://www.example.com/some/fixed/path/param1/value1/param2/value2/param3/value3"; 

var uri = "some/fixed/path/"; 


var url = url.substring(url.indexOf(uri) + uri.length) 
var options = url.split('/'); 
var results = []; 

for(var i=0;i<options.length; i+=2){ 
    results.push({[options[i]]:options[i+1]}) 
} 
0

Sie sind auf der Suche nach somethig wie das?

var url = "http://www.example.com/some/fixed/path/param1/value1/param2/value2/param3/value3"; 
 

 
var uri = "some/fixed/path/"; 
 
var params = []; 
 
var values = []; 
 
var results = {}; 
 
url.split(uri)[1].split('/').forEach(function(e,i) { 
 
    if(i%2==0){ 
 
    params.push(e) 
 
    } else { 
 
    values.push(e); 
 
    } 
 
}) 
 
console.log(params, values); 
 
params.forEach(function(e,i) { 
 
    results[e] = values[i]; 
 
    }); 
 
console.log(results);

0

Sie wie folgt tun können;

var text = "http://www.example.com/some/fixed/path/param1/value1/param2/value2/param3/value3"; 
 
    result = text.split("/") 
 
       .slice(6) 
 
       .reduce((r,c,i,a) => i&1 ? Object.assign(r,{[a[i-1]]: c}) : r, {}); 
 
console.log(result);

+0

Ein Paar 'fixed' /' path' ist nicht gültig, da es aus einem Teil des festen Pfades gebildet wird, der entfernt/ignoriert/übersprungen werden sollte – user5613506

+0

@ user5613506 Das hatte ich aber korrigiert anscheinend wurde es nicht auf deiner Seite aufgefrischt. Wenn Sie aktualisieren, sehen Sie möglicherweise die korrigierte Version. – Redu

+0

Ich sehe es jetzt, aber wie ich zu @ Rajeshs Lösung gesagt habe, sind alle Parameter Schlüssel und Werte mit 'param' und' value' nur hier vorangestellt, für das Beispiel, also glaube ich, dass dein 'slice' nicht auf Echt funktioniert Fallszenarien. – user5613506

0

Sie sind ganz in der Nähe, müssen Sie im Grunde eine andere für Ihre produzierten arr for-Schleife machen und alle 2 Werte treten. Wie so ...

var url = "http://www.example.com/some/fixed/path/param1/value1/param2/value2/param3/value3"; 

var uri = "some/fixed/path/"; 
var result = {}; 
url.split(uri).forEach(function(x){ 
    var arr = x.split('/'); 

    var step; 
    for (step = 0; step <= arr.length; step += 2) { 
     arr[step + 1] && (result[arr[step]] = arr[step + 1]); 
    } 
}); 

console.log(result); 
Verwandte Themen