当前位置:  开发笔记 > 编程语言 > 正文

JS中的对象字符串

如何解决《JS中的对象字符串》经验,为你挑选了7个好方法。

我有一个字符串

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

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

obj = {firstName:name1, lastName:last1}

我怎么能在JS中这样做?



1> code ninja..:

实际上,最好的解决方案是使用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();


我不敢回答这个问题.如果每个人都改变问题以适应答案,那就太好了.你如何解析"firstName:name1,lastName:last1"?不是'{"你好":"世界"}'.
这不回答问题,我不知道为什么会有这么多的赞成.提问者(和我自己,我用Google搜索并在此处结束)的数据不符合JSON标准,因此无法解析.
这是事实,但严格来说,函数不应该在任何JSON对象中.为此您有RPC等,或者如果您需要,您可以将函数的原型传递给j​​son,并稍后执行`eval`.

2> Philippe Ley..:

您的字符串看起来像没有花括号的JSON字符串.

这应该工作:

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


这取决于数据来自何处.有些人痴迷于安全.如果您控制数据,则可以更加务实地找到解决方案.或者你的厨房和起居室之间是否有防盗门?
这是一个潜在的安全漏洞.我根本不会推荐这种方法.
那不行.它给你错误**'SyntaxError:Unexpected token:'**.我在Chrome中查了一下.
解决方案需要围绕它的括号:`obj = eval('({'+ str +'})');`
prc322:每个人都知道eval()不是很安全(这是轻描淡写),但使用eval()是上述问题的唯一正确答案,因为输入字符串不是有效的JSON字符串而输入字符串引用其他变量按名字.
每个捍卫这个答案的人都应该获得零下10k的声望.Eval是一个不应该使用的坏函数.我甚至不在谈论这里的安全问题.您尝试评估的代码中有一个错误,您将有一个地狱的调试.window.JSON在很长一段时间内得到了广泛的支持:http://caniuse.com/json大多数JS框架也支持JSON解析.
它确实如此,但eval()将在没有它们的情况下工作.
JSON需要围绕键值的引用,不是吗?
任何人都可以解释为什么在使用控制台(Chrome)时,eval是JS中的安全漏洞,用户可以随时在浏览器上运行代码..除非它在Node.JS等中使用它.
你到底为什么会使用eval呢?它1:效率低2:不安全3:难以理解.请参阅我的回答@ http://stackoverflow.com/a/17597365/666835
-1:`eval`阻止JavaScript编译器进行优化.引擎只能在运行时知道,因为它欺骗了词法范围.

3> cdleary..:

如果我理解正确:

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

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

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


如果字符串中有逗号怎么办?这不是一个有用的答案......

4> 小智..:

这个简单的方法......

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

产量

name1


仅当您将值用引号引起来时,这才有效

5> mzalazar..:

如果您使用的是JQuery:

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

记住:eval是邪恶的!:d


问题所有者提供的字符串不是有效的JSON字符串.所以,这段代码没用......
jQuery使用`eval`.`globalEval:/**code**/window ["eval"] .call(window,data);/**更多代码**/`

6> 小智..:

您需要使用JSON.parse()将String转换为Object:

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



7> corysimmons..:

如果您有类似的字符串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/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/map

https://developer.mozilla.org/zh-CN/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!

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有