web-dev-qa-db-ja.com

JSのオブジェクトへの文字列

私は文字列を

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

今、私はそのような1つのオブジェクトobjが必要です

obj = {firstName:name1, lastName:last1}

JSでこれを行うにはどうすればいいですか。

160
hijibiji

実際のところ、最善の解決策は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();
150
code ninja

あなたの文字列は中括弧のないJSON文字列のように見えます。

これでうまくいくはずです。

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

私が正しく理解しているならば:

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

プロパティ名はコロンの左側にあり、文字列値は右側にあると仮定しています。

Array.forEachはJavaScript 1.6であることに注意してください - あなたは最大限の互換性のためにツールキットを使用したいかもしれません。

47
cdleary

この簡単な方法は….

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

出力

name1
31
Wianto Wie

jQueryを使用している場合

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

覚えておいてください:評価は悪です! :D

12
mzalazar

StringをObjectに変換するにはJSON.parse()を使う必要があります。

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

私は数行のコードでソリューションを実装しました。

私がカスタムオプションを渡したいところにこのような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')));
4
rodu

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!
3
corysimmons

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
2
Faisal Chishti
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];
       });
    }
2
Digitlimit

入力がどれほど長くても同じスキーマにある場合でも、これはユニバーサルコードです。:separator :)

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)
1
panatoni

私は JSON5 を使っています、そしてそれはかなりうまくいきます。

良いところは、noevalnonew Functionが含まれていることです。非常に安全です。使用する。

1
James Yang
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);
        });

「オブジェクト」配列はすべてのオブジェクトを持ちます

0
comeOnGetIt

あなたの場合

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]);
}
0
Vahag Chakhoyan