JS中的对象的string
我有一个string
string = "firstName:name1, lastName:last1";
现在我需要一个对象obj这样的
obj = {firstName:name1, lastName:last1}
我怎么能在JS中做到这一点?
其实,最好的解决scheme是使用JSON:
文档
JSON.parse(text[, reviver]);
例子:
1)
var myobj = JSON.parse('{ "hello":"world" }'); alert(myobj.hello); // 'world'
2)
var myobj = JSON.parse(JSON.stringify({ hello: "world" }); alert(myobj.hello); // 'world'
3)将一个函数传递给JSON
var obj = { hello: "World", sayHello: (function() { console.log("I say Hello!"); }).toString() }; var myobj = JSON.parse(JSON.stringify(obj)); myobj.sayHello = new Function("return ("+myobj.sayHello+")")(); myobj.sayHello();
你的string看起来像一个没有大括号的JSONstring。
然后这应该工作:
obj = eval('({' + str + '})');
如果我理解正确:
var properties = string.split(', '); var obj = {}; properties.forEach(function(property) { var tup = property.split(':'); obj[tup[0]] = tup[1]; });
我假设属性名称在冒号的左边,并且它所用的string值在右边。
请注意, Array.forEach
是JavaScript 1.6的 – 您可能需要使用工具包来实现最大的兼容性。
这个简单的方法…
var string = "{firstName:'name1', lastName:'last1'}"; eval('var obj='+string); alert(obj.firstName);
产量
name1
如果您使用JQuery:
var obj = jQuery.parseJSON('{"path":"/img/filename.jpg"}'); console.log(obj.path); // will print /img/filename.jpg
请记住:eval是邪恶的! :d
我用几行代码实现了一个解决scheme,它的工作非常可靠。
有一个像这样的HTML元素,我想传递自定义选项:
<div class="my-element" data-options="background-color: #dadada; custom-key: custom-value;"> </div>
一个函数parsing自定义选项并返回一个对象来使用它:
function readCustomOptions($elem){ var i, len, option, options, optionsObject = {}; options = $elem.data('options'); options = (options || '').replace(/\s/g,'').split(';'); for (i = 0, len = options.length - 1; i < len; i++){ option = options[i].split(':'); optionsObject[option[0]] = option[1]; } return optionsObject; } console.log(readCustomOptions($('.my-element')));
string = "firstName:name1, lastName:last1";
这将工作:
var fields = string.split(', '), fieldObject = {}; if( typeof fields === 'object') ){ fields.each(function(field) { var c = property.split(':'); fieldObject[c[0]] = c[1]; }); }
但是效率不高。 当你有这样的事情会发生什么:
string = "firstName:name1, lastName:last1, profileUrl:http://localhost/site/profile/1";
split()
会分裂'http'。 所以我build议你使用一个特殊的分隔符像pipe道
string = "firstName|name1, lastName|last1"; var fields = string.split(', '), fieldObject = {}; if( typeof fields === 'object') ){ fields.each(function(field) { var c = property.split('|'); fieldObject[c[0]] = c[1]; }); }
这是通用的代码,不pipe你的input多长,但是在相同的模式下,如果有:分隔符:)
var string = "firstName:name1, lastName:last1"; var pass = string.replace(',',':'); var arr = pass.split(':'); var empty = {}; arr.forEach(function(el,i){ var b = i + 1, c = b/2, e = c.toString(); if(e.indexOf('.') != -1 ) { empty[el] = arr[i+1]; } }); console.log(empty)
如果你有一个像foo: 1, bar: 2
那样的stringfoo: 1, bar: 2
你可以把它转换成一个有效的obj:
str .split(',') .map(x => x.split(':').map(y => y.trim())) .reduce((a, x) => { a[x[0]] = x[1]; return a; }, {});
感谢#javascript中的niggler。
var stringExample = "firstName:name1, lastName:last1 | firstName:name2, lastName:last2"; var initial_arr_objects = stringExample.split("|"); var objects =[]; initial_arr_objects.map((e) => { var string = e; var fields = string.split(','),fieldObject = {}; if( typeof fields === 'object') { fields.forEach(function(field) { var c = field.split(':'); fieldObject[c[0]] = c[1]; //use parseInt if integer wanted }); } console.log(fieldObject) objects.push(fieldObject); });
“对象”数组将拥有所有的对象
在你的情况
var KeyVal = string.split(", "); var obj = {}; var i; for (i in KeyVal) { KeyVal[i] = KeyVal[i].split(":"); obj[eval(KeyVal[i][0])] = eval(KeyVal[i][1]); }