2015-09-21 188 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

相关问题