2015-10-30 17 views
3

如何替換JSON對象的鍵中的空格動態?舉例來說,如果我有以下對象:如何使用Javascript動態地替換JSON對象鍵中的空格?

[{ 
    "FIRST NAME": "Philip", 
    "LAST NAME": "Rivers", 
    "NUMBER": "17", 
    "GPA": "1.0", 
    "OLD_FACTOR": "8", 
    "NICENESS": "1" 
}, { 
    "FIRST NAME": "Peyton", 
    "LAST NAME": "Manning", 
    "NUMBER": "18", 
    "GPA": "4.0", 
    "OLD_FACTOR": "5000", 
    "NICENESS": "5000" 
}] 

我希望能夠分別重命名動態「名」和「姓」到「FIRST_NAME」和「LAST_NAME」。根據研究,到目前爲止,我有這個功能:

function replaceSpaces(data) { 
    debugger; 
    for (var i = 0; i < data.length; i++) { 
     var obj = data[i]; 
     for (var key in obj) { 
      var replacedKey = key.split(' ').join('_'); 
      data[i][obj] = replacedKey; 
     } 
    } 

    return data; 
} 

中傳遞的「數據」參數是一個對象,已經有JSON.parse在進入此功能運行就可以了。

我對這段代碼的問題是,它循環通過鍵很好,並將正確的替換字符串分配給「replacedKey」,但它不會將其分配給原始數據對象。

+2

'data [i] [replacedKey] = data [i] [key];' – Pointy

+0

您是否真的在問JSON?也就是說,您是否有興趣轉換JSON文檔/字符串的文本內容,還是僅僅對JavaScript對象感興趣? – apsillers

+0

我有興趣修改JavaScript對象的關鍵名稱(如果我正確理解你的話)。我已經將它解析成了對象,所以我不想在之前改變字符串。 – xboxremote

回答

2

下面是使用forEach完整的代碼。

的步驟同Quentin在他answer

  1. 副本的規定值
  2. 從對象中刪除鍵值
  3. 與新價值的對象添加新項目

var arr = [{ 
 
    "FIRST NAME": "Philip", 
 
    "LAST NAME": "Rivers", 
 
    "NUMBER": "17", 
 
    "GPA": "1.0", 
 
    "OLD_FACTOR": "8", 
 
    "NICENESS": "1" 
 
}, { 
 
    "FIRST NAME": "Peyton", 
 
    "LAST NAME": "Manning", 
 
    "NUMBER": "18", 
 
    "GPA": "4.0", 
 
    "OLD_FACTOR": "5000", 
 
    "NICENESS": "5000" 
 
}]; 
 

 

 
// Iterate over array 
 
arr.forEach(function(e, i) { 
 
    // Iterate over the keys of object 
 
    Object.keys(e).forEach(function(key) { 
 
    
 
    // Copy the value 
 
    var val = e[key], 
 
     newKey = key.replace(/\s+/g, '_'); 
 
    
 
    // Remove key-value from object 
 
    delete arr[i][key]; 
 

 
    // Add value with new key 
 
    arr[i][newKey] = val; 
 
    }); 
 
}); 
 

 
console.log(arr); 
 
document.getElementById('result').innerHTML = JSON.stringify(arr, 0, 4);
<pre id="result"></pre>


嚴格,如果JSON是得到的字符串從服務器的形式:

通過_從鍵替換空間。

JSON.parse(jsonString.replace(/"([\w\s]+)":/g, function (m) { 
    return m.replace(/\s+/g, '_'); 
})); 
+0

好吧我想我現在理解你們。一秒鐘,我會盡量使它適合我的。 (由於性能考慮,我試圖避免使用.forEach函數)。 – xboxremote

+0

@xboxremote避免'forEach'?你應該避免'for ... in'以獲得更好的表現 – Tushar

+1

我的同事提到他發現了一些文章說.forEach表現較慢。然而,在研究自己時,由於測試混亂,這看起來可能是錯誤的。無論如何,這個工作非常完美(並且我最終使用了.forEach)。謝謝! – xboxremote

4

您需要:

  • 複製
  • 刪除舊的物業
  • 修改正確的對象。 (data[i][obj]會將obj轉換爲字符串並嘗試將其用作屬性名稱)。

這樣的:

for (var original_property in obj) { 
     var new_property = original_property.split(' ').join('_'); 
     obj[new_property] = obj[original_property]; 
     delete obj[original_property] 
    } 
+0

此處有輕微錯誤:key.split應爲original_property.split。 – Danmoreng

+0

@ user2415266固定 – Tushar

0

因爲它是JSON預期來作爲字符串,你可以用Regex幫助做到這一點。

var processedJson = yourJson.replace(/(+)(?=[(\w* *]*":)/g, "_"); 
var yourObj = JSON.parse(processedJson); 

/(+)(?=[(\w* *]*":)/g會發現內" ... ":這是每一個JSON對象上的一個鍵的所有ocurances。

+0

你可以在_Object_上使用'.replace'嗎? – Tushar

+0

對,我認爲圖沙爾就在這裏。在我解析JSON之前,我可以在我的邏輯中做到這一點,但在我的應用程序的上下文中沒有意義。在這個應用程序的這一點上,我不相信這會起作用。 – xboxremote

+0

正則表達式僅適用於字符串。但正如我所說的JSON字符串。或者你可以在你想要的任何時候在JS中的每個對象上使用'JSON.stringify()'當你的JSON作爲字符串(來自ajax)來使用Regex是一種有效的方法時,我看不到任何理由爲什麼我會使用@Tushar – webduvet

相關問題