String para o object em JS

Eu tenho uma string como

string = "firstName:name1, lastName:last1"; 

agora eu preciso de um object obj tal que

 obj = {firstName:name1, lastName:last1} 

Como posso fazer isso no JS?

Na verdade, a melhor solução é usar o JSON:

Documentação

JSON.parse(text[, reviver]);

Exemplos:

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) Passando uma function para 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(); 

Sua string parece uma string JSON sem as chaves.

Isso deve funcionar então:

 obj = eval('({' + str + '})'); 

Se estou entendendo corretamente:

 var properties = string.split(', '); var obj = {}; properties.forEach(function(property) { var tup = property.split(':'); obj[tup[0]] = tup[1]; }); 

Eu estou supondo que o nome da propriedade é à esquerda do cólon e o valor da cadeia que leva é para a direita.

Note que Array.forEach é JavaScript 1.6 – você pode querer usar um kit de ferramentas para compatibilidade máxima.

Essa maneira simples …

 var string = "{firstName:'name1', lastName:'last1'}"; eval('var obj='+string); alert(obj.firstName); 

saída

 name1 

se você estiver usando o JQuery:

 var obj = jQuery.parseJSON('{"path":"/img/filename.jpg"}'); console.log(obj.path); // will print /img/filename.jpg 

LEMBRE-SE: eval é mal! : D

Você precisa usar JSON.parse () para converter String em um object:

 var obj = JSON.parse('{ "firstName":"name1", "lastName": "last1" }'); 

Eu implementei uma solução em algumas linhas de código que funcionam de forma bastante confiável.

Ter um elemento HTML como este, no qual desejo passar opções personalizadas:

 

uma function analisa as opções personalizadas e retorna um object para usá-lo em algum lugar:

 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"; 

Isso vai funcionar:

 var fields = string.split(', '), fieldObject = {}; if( typeof fields === 'object') ){ fields.each(function(field) { var c = property.split(':'); fieldObject[c[0]] = c[1]; }); } 

No entanto, não é eficiente. O que acontece quando você tem algo assim:

 string = "firstName:name1, lastName:last1, profileUrl:http://localhost/site/profile/1"; 

split() dividirá ‘http’. Então eu sugiro que você use um delimitador especial como tubo

  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]; }); } 

Este é um código universal, não importa como sua input seja longa, mas no mesmo esquema, se houver: separador 🙂

 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) 

Se você tem uma string como foo: 1, bar: 2 você pode convertê-la em um obj válido com:

 str .split(',') .map(x => x.split(':').map(y => y.trim())) .reduce((a, x) => { a[x[0]] = x[1]; return a; }, {}); 

Obrigado ao niggler em #javascript por isso.

Atualize com explicações:

 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) 

Documentos do MDN confusos:

Demonstração: http://jsbin.com/hiduhijevu/edit?js,console

Função:

 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! 

No seu caso

 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]); } 
 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); }); 

array “objects” terá todos os objects