JS 中的对象字符串

IT技术 javascript string object
2021-02-02 18:44:29

我有一个字符串

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

现在我需要一个对象 obj 这样

obj = {firstName:name1, lastName:last1}

我怎样才能在 JS 中做到这一点?

6个回答

实际上,最好的解决方案是使用 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();
这是真的,但严格来说函数不应该在任何 JSON 对象中。为此,您有 RPC 等,或者如果您愿意,您可以将函数的原型传递给 json,然后再做eval
2021-03-15 18:44:29
var a = "firstName:name1, lastName:last1"; JSON.parse('{' + a + '}') 抛出错误。
2021-03-16 18:44:29
恐怕根本不回答这个问题。如果每个人都改变问题以适应答案,那就太好了。你如何解析“firstName:name1, lastName:last1”?不是'{“你好”:“世界”}'。
2021-04-04 18:44:29
虽然不允许传入函数
2021-04-08 18:44:29
这并没有回答问题,我不知道为什么它有这么多赞成票。提问者(和我自己,我用谷歌搜索并最终到了这里)的数据不符合 JSON 标准,因此无法解析。
2021-04-11 18:44:29

您的字符串看起来像一个没有花括号的 JSON 字符串。

这应该可以工作:

obj = eval('({' + str + '})');
该解决方案需要在其周围加上括号: obj = eval('({' + str + '})');
2021-03-17 18:44:29
这是一个潜在的安全漏洞。我根本不会推荐这种方法。
2021-03-24 18:44:29
这是行不通的。它给你错误'SyntaxError: Unexpected token :'我已经在 Chrome 中检查过了。
2021-03-27 18:44:29
prc322:每个人都知道 eval() 不是很安全(这是轻描淡写),但使用 eval() 是上述问题的唯一正确答案,因为输入字符串不是有效的 JSON 字符串并且输入字符串引用了其他变量按名字。
2021-04-03 18:44:29
这取决于数据来自哪里。有些人对安全很着迷。如果您控制自己的数据,就可以更加务实地寻找解决方案。或者你的厨房和客厅之间有防盗门吗?
2021-04-10 18:44:29

如果我理解正确:

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

我假设属性名称在冒号的左侧,而它所采用的字符串值在右侧。

请注意,这Array.forEach是 JavaScript 1.6 —— 您可能希望使用工具包以获得最大的兼容性。

级长职位。这个答案非常清楚地使用了 JavaScript 的基础知识,因此应该适用于每个浏览器
2021-03-16 18:44:29
我发现这种方法是一个好的开始,所以答案很有用。但是, xecute 有一个有效的观点,即它不容纳可能包含逗号的字符串。如果您的代码需要处理带逗号的字符串,您可以沿着匹配引号的路径前进,但您仍然无法捕获引号被转义的情况。只需执行您需要的内容,然后停止。
2021-03-21 18:44:29
在解析提问者提出的文本的问题中,“假设”的问题是无用的。我们可以接受给定的示例作为数据的代表,或者我们可以简单地不回答,因为总会有一个“假设”会破坏解析。
2021-03-24 18:44:29
嘿 Cdleary ......我想知道你是否可以帮助我:stackoverflow.com/questions/9357320 /......很抱歉,除了对你的答案发表评论外,找不到其他联系方式
2021-03-29 18:44:29
发帖人询问了如何解析无效 JSON 的异常结构。@cdleary 在这种情况下很好地回答了这个问题。xecute:处理字符串中的逗号需要引用或转义机制,这超出了本讨论的范围。
2021-03-31 18:44:29

这个简单的方法...

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

输出

name1
对此,尽管如此: var string = "{firstName:'name1', lastName:'last1', f: function(){alert('u got hacked...')}()}"; eval('var obj'+string) 这可能会让你被黑……但我认为这是值得的,因为它是唯一在某些情况下有效的东西。
2021-03-22 18:44:29
这是唯一可以直接解决问题的解决方案,尽管使用 eval 是危险的
2021-03-24 18:44:29
目前,在浏览器中执行的任何 JS 代码都是危险的。坦白说...这个答案是唯一能有效解决“JS中的字符串到对象”问题的解决方案。JSON.parse()仅限于 JSON 的范围。请记住,JSON 不是 JS 对象。谢谢!=D
2021-04-11 18:44:29

由于 JSON.parse() 方法需要将 Object 键括在引号内才能正常工作,因此在调用 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

这是不使用 eval() 的最接近的解决方案,并且几乎适用于字符串中的所有 JS 对象。但请注意,此解决方案不适用于将时间戳作为值!即 {from:"2021-05-09T22:00:00.000Z"} 可能转换为 {"from":"2021-05-09T"22":"00":00.000Z"}
2021-03-30 18:44:29