2015-09-21 242 views
1

我是JS新手,想知道將JavaScript中的以下內容轉換爲對象的最佳方法是什麼?我想保留被串化的鍵值對。將一串字符串(其中每個字符串是一個鍵值對)轉換爲一個對象

[ 
    "\"Matt Forte : 17", 
    "C.J. Anderson : 16", 
    "Jamaal Charles : 16", 
    "Eddie Lacy : 15", 
    "Andre Ellington : 14", 
    "LeSean McCoy : 14", 
    "Marshawn Lynch : 14Tre Mason : 13", 
    "Latavius Murray : 13", 
    "Rashad Jennings : 12", 
    "Alfred Morris : 12", 
    "Jonathan Stewart : 12", 
    "Doug Martin : 12", 
    "Chris Ivory : 12", 
    "\"" 
] 

我試過這個,但沒有奏效!有沒有人爲我做這樣的事情?也許我應該存儲的數據爲對象,開始與...

var players = [ 
    "\"Matt Forte : 17", 
    "C.J. Anderson : 16", 
    "Jamaal Charles : 16", 
    "Eddie Lacy : 15", 
    "Andre Ellington : 14", 
    "LeSean McCoy : 14", 
    "Marshawn Lynch : 14Tre Mason : 13", 
    "Latavius Murray : 13", 
    "Rashad Jennings : 12", 
    "Alfred Morris : 12", 
    "Jonathan Stewart : 12", 
    "Doug Martin : 12", 
    "Chris Ivory : 12", 
    "\"" 
]; 

var obj = {}; 
for (var i = 0; i< players.length; i++) { 
    var tuple = players[i].split(":"); 
    console.log(tuple); 
    for(var key in obj){ 
     key = tuple[0]; 
     obj[key] = tuple[1]; 

    } 
}; 

console.log(obj); 

回答

1

嘗試使用RegExp分割鍵和值:

var arr = [ 
 
    "\"Matt Forte : 17", 
 
    "C.J. Anderson : 16", 
 
    "Jamaal Charles : 16", 
 
    "Eddie Lacy : 15", 
 
    "Andre Ellington : 14", 
 
    "LeSean McCoy : 14", 
 
    "Marshawn Lynch : 14Tre Mason : 13", 
 
    "Latavius Murray : 13", 
 
    "Rashad Jennings : 12", 
 
    "Alfred Morris : 12", 
 
    "Jonathan Stewart : 12", 
 
    "Doug Martin : 12", 
 
    "Chris Ivory : 12", 
 
    "\"" 
 
]; 
 
//re-build proper key-value pairs 
 
arr = arr.join('').match(/([\w|\.\s]*\:\s\d*)/g); 
 
var obj = {}; 
 
var l = arr.length; 
 
var tmp; 
 
var rgx = /\s?\:\s?/; 
 
while (l--) { 
 
    tmp = arr[l].split(rgx); 
 
    obj[tmp[0]] = tmp[1]; 
 
} 
 
document.write("<pre>"); 
 
document.write(JSON.stringify(arr)); 
 
document.write("<br/>"); 
 
document.write(JSON.stringify(obj, 0, 4)); 
 
document.write("</pre>");

+0

這個版本一起刪除了一些條目。另外貧窮的梅爾梅森總是依附於Marshawn Lynch! – devdropper87

+0

真棒,但現在C.J.安德森錯過了他的名字:) – devdropper87

+0

@ devdropper87,請找我的更新 – Arvind

2

像這樣:

function prestoChango(ary){ 
    var o = {}; 
    for(var i=0,l=ary.length; i<l; i++){ 
    var s = ary[i].split(/\s*\:\s*/); 
    o[s[0]] = +s[1]; 
    } 
    return o; 
} 
console.log(prestoChango(arrayOfStrings)); 
+0

真棒感謝,該代碼扔指向分割功能錯誤的:var s = ary.split(/ \ s \:??\ S/); – devdropper87

+0

對不起,省略了增量。 – PHPglue

2

使用Array.prototype.map

var stringArray = [ 
 
    "\"Matt Forte : 17", 
 
    "C.J. Anderson : 16", 
 
    "Jamaal Charles : 16", 
 
    "Eddie Lacy : 15", 
 
    "Andre Ellington : 14", 
 
    "LeSean McCoy : 14", 
 
    "Marshawn Lynch : 14Tre Mason : 13", 
 
    "Latavius Murray : 13", 
 
    "Rashad Jennings : 12", 
 
    "Alfred Morris : 12", 
 
    "Jonathan Stewart : 12", 
 
    "Doug Martin : 12", 
 
    "Chris Ivory : 12", 
 
    "\"" 
 
]; 
 

 
var objectArray = stringArray.map(function(string) { 
 
    var splat = string.replace("\"", "").split(' : '); 
 
    var obj = {}; 
 
    obj[splat[0]] = splat[1]; 
 
    return obj; 
 
}); 
 

 
console.log(objectArray);

+0

太棒了。如果我試圖在一個對象中取代每個stringArray [i]的單獨對象,那麼我會改變什麼?另外,外部數組括號仍然存在於上面的實現中。 – devdropper87

+0

@ devdropper87,更新了我的答案以刪除括號。是的,對於每一個都可以填寫對象 – AmmarCSE

1

使用映射函數來創建兩個新的陣列,含有該鍵和值分別。

創建一個空對象,然後迭代鍵或值數組。

var names = players.map(function(player) { return player.split(':')[0] } 
var score = players.map(function(player) { return player.split(':')[1] } 

var object = {} 

for (var i = 0; i < names.length; i++) { 
    object[names[i]] = score[i]; 
} 

這裏是我的輸出看起來像

{ 'Matt Forte': '17', 
    'C.J. Anderson': '16', 
    'Jamaal Charles': '16', 
    'Eddie Lacy': '15' 
... 
} 
+0

這個版本一起刪除了一些條目。另外貧窮的梅爾梅森總是依附於Marshawn Lynch! – devdropper87

1

不幸的是,使用您的陣列的最後一個項目split打破所有張貼的答案。 這裏是應該很好地工作稍微複雜一點的辦法:

var object = {}; 
players.map(function(string) { 
    string.replace(/(.+) : (\d+)/,function($0,$1,$2){object[$1]=$2;}); 
}); 
+0

該版本一起刪除了一些條目。另外貧窮的梅爾梅森總是依附於Marshawn Lynch! – devdropper87

+0

@ devdropper87我只是雙重檢查,我得到所有的球員:http://jsfiddle.net/nbgtm3cj/1/。至於Tre Mason,我認爲這是你的文章中的一個錯字。 – Christophe

相關問題