我有一个字符串as
string = "firstName:name1, lastName:last1";
现在我需要一个对象obj这样
obj = {firstName:name1, lastName:last1}
我如何在JS中做到这一点?
我有一个字符串as
string = "firstName:name1, lastName:last1";
现在我需要一个对象obj这样
obj = {firstName:name1, lastName:last1}
我如何在JS中做到这一点?
当前回答
如果你有一个像foo: 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。
更新说明:
const obj = 'foo: 1, bar: 2'
.split(',') // split into ['foo: 1', 'bar: 2']
.map(keyVal => { // go over each keyVal value in that array
return keyVal
.split(':') // split into ['foo', '1'] and on the next loop ['bar', '2']
.map(_ => _.trim()) // loop over each value in each array and make sure it doesn't have trailing whitespace, the _ is irrelavent because i'm too lazy to think of a good var name for this
})
.reduce((accumulator, currentValue) => { // reduce() takes a func and a beginning object, we're making a fresh object
accumulator[currentValue[0]] = currentValue[1]
// accumulator starts at the beginning obj, in our case {}, and "accumulates" values to it
// since reduce() works like map() in the sense it iterates over an array, and it can be chained upon things like map(),
// first time through it would say "okay accumulator, accumulate currentValue[0] (which is 'foo') = currentValue[1] (which is '1')
// so first time reduce runs, it starts with empty object {} and assigns {foo: '1'} to it
// second time through, it "accumulates" {bar: '2'} to it. so now we have {foo: '1', bar: '2'}
return accumulator
}, {}) // when there are no more things in the array to iterate over, it returns the accumulated stuff
console.log(obj)
令人困惑的MDN文档:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
演示:http://jsbin.com/hiduhijevu/edit?js,控制台
功能:
const str2obj = str => {
return str
.split(',')
.map(keyVal => {
return keyVal
.split(':')
.map(_ => _.trim())
})
.reduce((accumulator, currentValue) => {
accumulator[currentValue[0]] = currentValue[1]
return accumulator
}, {})
}
console.log(str2obj('foo: 1, bar: 2')) // see? works!
其他回答
这是通用代码,不管你的输入有多长,但如果有:分隔符:)
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)
在你的情况下,简短而漂亮的代码
Object.fromEntries(str.split(',').map(i => i.split(':')));
在你的情况下
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]);
}
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'。所以我建议您使用一个特殊的分隔符,如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];
});
}
由于JSON.parse()方法需要将对象键括在引号中才能正确工作,因此在调用JSON.parse()方法之前,我们首先必须将字符串转换为JSON格式的字符串。
var obj = '{firstName:"John", lastName:"Doe"}'; var jsonStr = obj.replace(/(\w+:)|(\w+:)/g,函数(匹配str) { 返回' ' ' + matchedStr。substring (0, matchedStr。长度- 1)+ '":'; }); obj = JSON.parse(jsonStr);//转换为常规对象 console.log (obj.firstName);//期望输出:John console.log (obj.lastName);//期望输出:Doe
即使字符串有一个复杂的对象(如下所示),这也可以工作,并且仍然可以正确地转换。只要确保字符串本身是用单引号括起来的。
var strorobj = '{名字:"John Doe",年龄:33岁,最爱:{体育:["篮球","棒球"],电影:["星球大战","出租车司机"]}}'; var jsonStr = strObj.replace (/ (\ w +:) | (\ w +:) / g函数(s) { 返回' ' ' + s.substring(0, s.length-1) + ' ' ':'; }); var obj = JSON.parse(jsonStr); console.log (obj.favorites.movies [0]);//期望输出:Star Wars . //