2011-09-27 47 views
0

我有使用此命名convetion輸入的形式:Substringing JSON鍵

<input class="xxlarge" name="note[url]" id="url" placeholder="URL"> 

所以,我使用this script(StackOverflow上找到)序列化格式數據轉換成JSON。

$.fn.serializeObject = function() 
{ 
var o = {}; 
var a = this.serializeArray(); 
$.each(a, function() { 
    if (o[this.name] !== undefined) { 
     if (!o[this.name].push) { 
      o[this.name] = [o[this.name]]; 
     } 
     o[this.name].push(this.value || ''); 
    } else { 
     o[this.name] = this.value || ''; 
    } 
}); 
return o; 
}; 

,並在輸出我有這樣的:

{"note[url]":"URL","note[title]":"TITLE"} 

我想知道如何改造這個腳本來獲取輸出像這樣:

{"url":"URL","title":"TITLE"} 

我管這來自具有相當標準的文件化代碼塊(使用上述功能):

 $(function() { 
     $('form').submit(function() { 
     $('#result').html(JSON.stringify($('form').serializeObject())); 
      $.post(
       "/api/create", 
       JSON.stringify($('form').serializeObject()), 
       function(responseText){ 
        $("#result").html(responseText); 
       }, 
       "html" 
     ); 
      return false; 
     }); 

在此先感謝!

+0

我覺得你的代碼稍微有點幫助。 –

+0

鑑於該字段名稱符號,您使用的是PHP服務器?任何理由你需要在JS中分割這些值?一旦提交數據,PHP會很樂意將它們轉換爲數組。 –

回答

1

我建議將字符串解析爲JS對象,更改for循環中的鍵,然後在完成時將其字符串化。像這樣:

// turn the string into a JS object 
var data = JSON.parse('{"note[url]":"URL","note[title]":"TITLE"}'); 
var newData = {}; 
// step through each member 
for(key in data) { 
    // Regular expressions to find the brackets 
    var newKeyStart = key.search(/note\[/) + 5; 
    var newKeyEnd = key.search(/\]/); 
    // pull out the desired part of the key 
    var newKey = key.substr(newKeyStart, newKeyEnd - newKeyStart); 
    // insert into new data object 
    newData[newKey] = data[key]; 
    } 
// turn back into JSON again 
var newJSON = JSON.stringify(newData); 
+0

並不是說您不能依賴JSON庫在舊版瀏覽器上顯示。如果您擔心這一點,請包括Douglas Crockford的JSON庫:https://github.com/douglascrockford/JSON-js/blob/master/json2.js – visum

1

不確定'note'部分來自哪裏。可能是您可以通過標記中的name屬性修復的內容。否則,你總是可以這樣做:

function renameKeys(obj) { 
    var 
     result = {}, 
     key, 
     check, 
     noteReg = /^note\[([^\]]+)\]$/; 

    for(key in obj) { 
     result[(check = key.match(noteReg)) === null ? key : check[1]] = typeof obj[key] == 'object' && toString.call(obj[key]) == '[object Object]' ? renameKeys(obj[key]) : obj[key]; 
    } 

    return result; 
} 

可以用來製作對象你想要的鑰匙。

renameKeys({"note[url]":"URL","note[title]":"TITLE"}); 
// { url: 'URL', title: 'TITLE' } 

renameKeys({"note[url]":"URL","note[title]":"TITLE", anotherObj: { thingA: 1234, 'note[thingB]': 9492}}); 
// { url: 'URL', title: 'TITLE', anotherObj: { thingA: 1234, thingB: 9492 } } 

要小心,不過,如果您有類似的note[asdf]一個關鍵的asdf一個鍵,然後取其迭代比去年將覆蓋其他。