Tôi có một chuỗi như
string = "firstName:name1, lastName:last1";
bây giờ tôi cần một đối tượng obj sao cho
obj = {firstName:name1, lastName:last1}
Làm thế nào tôi có thể làm điều này trong JS?
Tôi có một chuỗi như
string = "firstName:name1, lastName:last1";
bây giờ tôi cần một đối tượng obj sao cho
obj = {firstName:name1, lastName:last1}
Làm thế nào tôi có thể làm điều này trong JS?
Câu trả lời:
Trên thực tế, giải pháp tốt nhất là sử dụng 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) Truyền một hàm cho 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
sau.
Chuỗi của bạn trông giống như một chuỗi JSON mà không có dấu ngoặc nhọn.
Điều này sẽ làm việc sau đó:
obj = eval('({' + str + '})');
obj = eval('({' + str + '})');
Nếu tôi hiểu đúng:
var properties = string.split(', ');
var obj = {};
properties.forEach(function(property) {
var tup = property.split(':');
obj[tup[0]] = tup[1];
});
Tôi giả sử rằng tên thuộc tính nằm ở bên trái dấu hai chấm và giá trị chuỗi mà nó nhận là ở bên phải.
Lưu ý đó Array.forEach
là JavaScript 1.6 - bạn có thể muốn sử dụng bộ công cụ để tương thích tối đa.
Cách đơn giản này ...
var string = "{firstName:'name1', lastName:'last1'}";
eval('var obj='+string);
alert(obj.firstName);
đầu ra
name1
nếu bạn đang sử dụng JQuery:
var obj = jQuery.parseJSON('{"path":"/img/filename.jpg"}');
console.log(obj.path); // will print /img/filename.jpg
HÃY NHỚ: eval là ác! : D
eval
. globalEval: /** code **/ window[ "eval" ].call( window, data ); /** more code **/
Bạn cần sử dụng JSON.parse () để chuyển đổi Chuỗi thành Đối tượng:
var obj = JSON.parse('{ "firstName":"name1", "lastName": "last1" }');
Do phương thức JSON.parse () yêu cầu các khóa Object được đặt trong dấu ngoặc kép để nó hoạt động chính xác, trước tiên chúng ta phải chuyển đổi chuỗi thành chuỗi có định dạng JSON trước khi gọi phương thức JSON.parse ().
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
Điều này sẽ hoạt động ngay cả khi chuỗi có một đối tượng phức tạp (như sau) và nó vẫn sẽ chuyển đổi chính xác. Chỉ cần đảm bảo rằng chính chuỗi được đặt trong dấu ngoặc đơn.
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
Nếu bạn có một chuỗi như foo: 1, bar: 2
bạn có thể chuyển đổi nó thành một obj hợp lệ với:
str
.split(',')
.map(x => x.split(':').map(y => y.trim()))
.reduce((a, x) => {
a[x[0]] = x[1];
return a;
}, {});
Cảm ơn niggler trong #javascript vì điều đó.
Cập nhật với lời giải thích:
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)
Tài liệu MDN khó hiểu:
Bản trình diễn: http://jsbin.com/hiduhijevu/edit?js,console
Chức năng:
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!
Tôi đã triển khai một giải pháp trong một vài dòng mã hoạt động khá đáng tin cậy.
Có một yếu tố HTML như thế này nơi tôi muốn vượt qua các tùy chọn tùy chỉnh:
<div class="my-element"
data-options="background-color: #dadada; custom-key: custom-value;">
</div>
một hàm phân tích các tùy chọn tùy chỉnh và trả về một đối tượng để sử dụng ở đâu đó:
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-
thuộc tính thay vì tạo các thuộc tính giả tùy chỉnh như một số khung / thư viện.
string = "firstName:name1, lastName:last1";
Điều này sẽ làm việc:
var fields = string.split(', '),
fieldObject = {};
if( typeof fields === 'object') ){
fields.each(function(field) {
var c = property.split(':');
fieldObject[c[0]] = c[1];
});
}
Tuy nhiên nó không hiệu quả. Điều gì xảy ra khi bạn có một cái gì đó như thế này:
string = "firstName:name1, lastName:last1, profileUrl:http://localhost/site/profile/1";
split()
sẽ chia 'http'. Vì vậy, tôi khuyên bạn nên sử dụng một dấu phân cách đặc biệt như ống
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];
});
}
Tôi đang sử dụng JSON5 và nó hoạt động khá tốt.
Phần tốt là nó không chứa eval
và không new Function
, rất an toàn để sử dụng.
Đây là mã phổ quát, cho dù đầu vào của bạn dài như thế nào nhưng trong cùng một lược đồ nếu có: dấu phân cách :)
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)
Trong trường hợp của bạn
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);
});
mảng "đối tượng" sẽ có tất cả các đối tượng
Tôi biết đây là một bài viết cũ nhưng không thấy câu trả lời chính xác cho câu hỏi.
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);
Bây giờ bạn có thể sử dụng obj.firstName
và obj.lastName
để có được các giá trị như bạn có thể làm bình thường với một đối tượng.