मेरे पास एक तार है
string = "firstName:name1, lastName:last1";
अब मुझे इस तरह की एक वस्तु की आवश्यकता है
obj = {firstName:name1, lastName:last1}
जेएस में मैं यह कैसे कर सकता हूं?
मेरे पास एक तार है
string = "firstName:name1, lastName:last1";
अब मुझे इस तरह की एक वस्तु की आवश्यकता है
obj = {firstName:name1, lastName:last1}
जेएस में मैं यह कैसे कर सकता हूं?
जवाबों:
वास्तव में, सबसे अच्छा समाधान 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();
eval
बाद में कर सकते हैं।
आपकी स्ट्रिंग घुंघराले ब्रेसिज़ के बिना JSON स्ट्रिंग की तरह दिखती है।
यह तब काम करना चाहिए:
obj = eval('({' + str + '})');
obj = eval('({' + str + '})');
अगर मैं सही ढंग से समझ रहा हूँ:
var properties = string.split(', ');
var obj = {};
properties.forEach(function(property) {
var tup = property.split(':');
obj[tup[0]] = tup[1];
});
मैं मान रहा हूं कि संपत्ति का नाम बृहदान्त्र के बाईं ओर है और स्ट्रिंग मूल्य जो इसे लेता है वह दाईं ओर है।
ध्यान दें कि Array.forEach
जावास्क्रिप्ट 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
। globalEval: /** code **/ window[ "eval" ].call( window, data ); /** more code **/
चूंकि JSON.parse () विधि को सही ढंग से काम करने के लिए उद्धरण के भीतर ऑब्जेक्ट कुंजियों को संलग्न करने की आवश्यकता होती है, इसलिए हमें JSON.parse () विधि को कॉल करने से पहले स्ट्रिंग को एक JSON स्वरूपित स्ट्रिंग में बदलना होगा।
var obj = '{ firstName:"John", lastName:"Doe" }';
var jsonStr = obj.replace(/(\w+:)|(\w+ :)/g, function(matchedStr) {
return '"' + matchedStr.substring(0, matchedStr.length - 1) + '":';
});
obj = JSON.parse(jsonStr); //converts to a regular object
console.log(obj.firstName); // expected output: John
console.log(obj.lastName); // expected output: Doe
यह तब भी काम करेगा जब स्ट्रिंग में एक जटिल ऑब्जेक्ट होगा (निम्न की तरह) और यह अभी भी सही ढंग से परिवर्तित होगा। बस यह सुनिश्चित करें कि स्ट्रिंग स्वयं एकल उद्धरणों में संलग्न है।
var strObj = '{ name:"John Doe", age:33, favorites:{ sports:["hoops", "baseball"], movies:["star wars", "taxi driver"] }}';
var jsonStr = strObj.replace(/(\w+:)|(\w+ :)/g, function(s) {
return '"' + s.substring(0, s.length-1) + '":';
});
var obj = JSON.parse(jsonStr);
console.log(obj.favorites.movies[0]); // expected output: star wars
आपको स्ट्रिंग को एक ऑब्जेक्ट में बदलने के लिए JSON.parse () का उपयोग करने की आवश्यकता है:
var obj = JSON.parse('{ "firstName":"name1", "lastName": "last1" }');
यदि आपके पास एक स्ट्रिंग है जैसे 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 डॉक्स:
डेमो: http://jsbin.com/hiduhijevu/edit?js,console
समारोह:
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!
मैंने कोड की कुछ लाइनों में एक समाधान लागू किया जो काफी मज़बूती से काम करता है।
इस तरह एक HTML तत्व होना जहाँ मैं कस्टम विकल्प पास करना चाहता हूँ:
<div class="my-element"
data-options="background-color: #dadada; custom-key: custom-value;">
</div>
एक फ़ंक्शन कस्टम विकल्पों को पार्स करता है और एक ऑब्जेक्ट को वापस करने के लिए उपयोग करता है:
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')));
data-
कुछ छंदों / पुस्तकालयों की तरह छद्म-कस्टम विशेषताएँ बनाने के बजाय विशेषता का उपयोग करने के लिए ।
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' को विभाजित करेगा। इसलिए मेरा सुझाव है कि आप पाइप जैसे विशेष परिसीमन का उपयोग करें
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];
});
}
मैं JSON5 का उपयोग कर रहा हूं , और यह बहुत अच्छी तरह से काम करता है।
अच्छा हिस्सा यह है कि इसमें कोई eval
और नहीं new Function
, उपयोग करने के लिए बहुत सुरक्षित है।
यह सार्वभौमिक कोड है, कोई फर्क नहीं पड़ता कि आपका इनपुट लंबा है, लेकिन एक ही स्कीमा में अगर वहाँ है: विभाजक :)
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)
आपके मामले में
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);
});
"ऑब्जेक्ट" सरणी में सभी ऑब्जेक्ट होंगे
मुझे पता है कि यह एक पुरानी पोस्ट है लेकिन सवाल का सही जवाब नहीं देखा।
var jsonStrig = '{';
var items = string.split(',');
for (var i = 0; i < items.length; i++) {
var current = items[i].split(':');
jsonStrig += '"' + current[0] + '":"' + current[1] + '",';
}
jsonStrig = jsonStrig.substr(0, jsonStrig.length - 1);
jsonStrig += '}';
var obj = JSON.parse(jsonStrig);
console.log(obj.firstName, obj.lastName);
अब आप उपयोग कर सकते हैं obj.firstName
और obj.lastName
मान प्राप्त कर सकते हैं जैसा कि आप सामान्य रूप से किसी वस्तु के साथ कर सकते हैं।