2017-06-12 32 views
1

分離URL像http://www.example.com/some/fixed/path/param1/value1/param2/value2/param3/value3我怎麼能建立與此URL的動態參數(參數1 /值,參數2 /值2 ...)一鍵/值對象?構建鍵/值對象從給定一個斜槓斜槓分隔的URL

有效參數始終將此斜槓分隔paramvalue格式,some/fixed/path將是手動提供的子字符串。

我試圖通過固定的子字符串拆分完整的URL(或任何它可能),我設法切出動態參數,因爲我想但我不能創建鍵/值對象,因爲我需要:

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);

但是這段代碼只帶給我的第一對,而不是所有的人都和它要求uri來強制性地有結尾的斜線。如果子字符串沒有或左邊有一個,它會用一個空白鍵和第一個鍵作爲值o.O

我知道這很簡單,但我無法做到。我試圖尋找,但這必須有一個非常特殊的方式來指代,因爲我不能用我自己的發現。

最後一件事,如果你不介意的解釋,而不是隻給我的魚,我會很感激,所以不會有下一次...希望

+0

url.replace(「somefixedpath」,「」)。split(「/」)。過濾器(E => E); –

回答

2

你只取some/fixed/path/後第二部分。您需要拆分這第二部分和迭代陣列上。在每個偶數索引,創建與所述前一個元素

x的名稱的對象的新屬性是當前元素

i是當前索引

a是含有後的各元素的數組與/

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);

012分裂
+0

你能告訴我你爲什麼不需要'else'嗎?無論如何,你的解決方案與我的嘗試有同樣的警告。 URI **必須**有尾部斜線。我能對此作出反應嗎?也許刪除雙方所有的斜槓,然後附加一個到最後? – user5613506

+0

@ user5613506因爲他正在使用'a [i-1]'訪問以前的值,所以不需要else。 – Rajesh

+0

我需要做一些調整,比如去掉現有的斜槓並手動添加一個到最後,以及處理一些警告,比如當固定路徑不存在時(例如'http://www.example.com/ param1/value1/param2/value2/param3/value3'),但你的解決方案是涵蓋更多地形的解決方案。你解釋了一下,因爲我問:) – user5613506

0

試試這個:

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

您正在尋找這樣的somethig?

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

你可以做如下:

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

一對'固定'/'路徑'是不是一個有效的,因爲它是從應該被刪除/忽略/跳過的固定路徑的一部分形成 – user5613506

+0

@ user5613506我已經糾正,但顯然它沒有在你的頁面上刷新。如果刷新,則可能會看到更正的版本。 – Redu

+0

我現在看到它,但就像我對@ Rajesh的解決方案所說的那樣,所有參數鍵和值都只在這裏以'param'和'value'作爲前綴,所以我相信你的'slice'不會在真實案例場景。 – user5613506

0

你是相當接近,你基本上需要再拍for循環的生產ARR和步驟,每2倍的值。像這樣...

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);