JS中的对象字符串

175 javascript string object

我有一个字符串

string = "firstName:name1, lastName:last1"; 
Run Code Online (Sandbox Code Playgroud)

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

obj = {firstName:name1, lastName:last1}
Run Code Online (Sandbox Code Playgroud)

我怎么能在JS中这样做?

cod*_*nja 158

实际上,最好的解决方案是使用JSON:

文档

JSON.parse(text[, reviver]);

例子:

1)

var myobj = JSON.parse('{ "hello":"world" }');
alert(myobj.hello); // 'world'
Run Code Online (Sandbox Code Playgroud)

2)

var myobj = JSON.parse(JSON.stringify({
    hello: "world"
});
alert(myobj.hello); // 'world'
Run Code Online (Sandbox Code Playgroud)

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();
Run Code Online (Sandbox Code Playgroud)

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

Phi*_*ert 68

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

这应该工作:

obj = eval('({' + str + '})');
Run Code Online (Sandbox Code Playgroud)

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

cdl*_*ary 49

如果我理解正确:

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

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

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

  • 如果字符串中有逗号怎么办?这不是一个有用的答案...... (5认同)

小智 34

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

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

产量

name1
Run Code Online (Sandbox Code Playgroud)

  • 仅当您将值用引号引起来时,这才有效 (2认同)

Fai*_*hti 19

由于 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
Run Code Online (Sandbox Code Playgroud)

即使字符串具有复杂对象(如下所示),这也会起作用,并且它仍然可以正确转换。只需确保字符串本身包含在单引号内。

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
Run Code Online (Sandbox Code Playgroud)


mza*_*zar 12

如果您使用的是JQuery:

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

记住:eval是邪恶的!:d

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

小智 9

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

var obj = JSON.parse('{ "firstName":"name1", "lastName": "last1" }');
Run Code Online (Sandbox Code Playgroud)


小智 8

就你而言,简短而美丽的代码

Object.fromEntries(str.split(',').map(i => i.split(':')));
Run Code Online (Sandbox Code Playgroud)


cor*_*ons 6

如果您有类似的字符串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;
  }, {});
Run Code Online (Sandbox Code Playgroud)

感谢#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)
Run Code Online (Sandbox Code Playgroud)

令人困惑的MDN文档:

演示: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!
Run Code Online (Sandbox Code Playgroud)

  • 这绝对是最优雅的解决方案,并且实际上回答了与许多其他答案不同的问题。谢谢你的解释! (4认同)

rod*_*odu 5

我用几行代码实现了一个非常可靠的解决方案。

有一个像这样的 HTML 元素,我想在其中传递自定义选项:

<div class="my-element"
    data-options="background-color: #dadada; custom-key: custom-value;">
</div>
Run Code Online (Sandbox Code Playgroud)

一个函数解析自定义选项并返回一个对象以在某处使用它:

<div class="my-element"
    data-options="background-color: #dadada; custom-key: custom-value;">
</div>
Run Code Online (Sandbox Code Playgroud)


Jam*_*ang 5

我正在使用JSON5,它运行得很好。

好的部分是它不含任何 成分eval,使用起来非常安全。 new Function