2017-02-18 7 views
0

一連の文字列をインラインでJSで解析しようとしています。目標は、これらの変数を名前の値のペアを持つオブジェクトに変換することです。JavaScript。どのようにして文字列を解析し、プロパティを持つオブジェクトに変換できますか?

例:

var hwStr = "color=blue+coreCnt=4+shell=aluminum+wireless=false"; 

私は、私はこのような名前と値のペアの配列を取得するには、元の文字列を解析することができます知っている:

varArr = hwStr.split("+"); 

私はその配列を印刷するとき、私はなるだろう:

>color=blue, 
>coreCnt=4, 
>shell=aluminum, 
>wireless=false 

このオブジェクトを手動で作成するには、私の質問は、私は名前と値のペアとしてこれらを持つことになり、オブジェクトを作成するために、foreach文をどのように使用できるか、である

var hwSpec = {color: 'blue', coreCnt: 4, shell: 'aluminum', wireless: false}; 

:次のようになります。

JSは私の言葉ではありませんが、私はこれを知っておくべきであることを知っています...これはおそらくノブです。どんな助けも素晴らしいでしょう。

UnKulMunki

答えて

1

まず別名ゲイリー・Cは、あなたはとてもあなたがキー/値のペアの配列を取得+で文字列を分割します。 次に、これらのペアをループし、=で各ペアを分割して、キーと値を区切ります。次に、キーをプロパティ名として割り当て、値をプロパティ値として割り当てます。

var hwStr = "color=blue+coreCnt=4+shell=aluminum+wireless=false"; 
 

 
// Split the string into an array of key/value pairs 
 
var pairs = hwStr.split("+"); 
 

 
// Set up a new, empty object 
 
var newObj = {}; 
 

 
// Loop through the key/value pairs array. The .forEach method takes 
 
// a function as an argument that, itself, receives a value representing 
 
// the current array item being iterated (a single key/value pair from 
 
// the array in this case). 
 
pairs.forEach(function(pair){ 
 
    // Create a new property on the object with the key of the current pair 
 
    // and a value of the value of the current pair. 
 
    newObj[pair.split("=")[0]] = pair.split("=")[1]; 
 
}); 
 

 
console.log(newObj);

+0

私はあなたの答えにそれらの編集のためにごめんなさい、私は自分の答えの最後にメモを追加したかったのですが、誤ってあなたのものをクリックしました。 (私は最後に追加していただけなので、読んでも気にしませんでした。非常に恥ずかしいです。)私はメモを削除しました。 – nnnnnn

+0

これはクールでクリーンなソリューション@Scott Marcosです。フォローするのはとても簡単です。 nnnnnnも良い解決策を持っていましたが、私はあなたがどこを見ているかを一目で分かりました。 迅速な対応をありがとうございます。 –

3

プラス記号で分離した後、各key=valueペアを処理するために、得られた配列を.reduce()でき、オブジェクトに追加する:

var hwStr = "color=blue+coreCnt=4+shell=aluminum+wireless=false"; 
 

 
var obj = hwStr.split("+").reduce(function(o, item) { 
 
    item = item.split("="); 
 
    o[item[0]] = item[1]; 
 
    return o; 
 
}, {}); 
 

 
console.log(obj);

これはと似ていますを呼び出します。ただし、.forEach()を呼び出す前に変数に空のオブジェクトを作成する代わりに、空のオブジェクトが.reduce()の引数として渡されます。この特定の問題については大きな違いはありませんが、場合によっては.reduce()は一時的な作業変数を作成する必要がありません。

EDITは:私のコードは、文字列としてすべてのプロパティ値を作成することに注意してください - 私はあなたがそのすべての値を仮定する場合を除きfalseがブールfalseまたは文字列"false"として扱われるべきかどうかを知るためにどのような方法は、ないと思うことはブール値またはブール値として扱われるべきであると解釈されるべきである。ブール値または数として扱われるべきである。

+0

確かな答え@nnnnnn。私はreduceメソッドが好きですが、私はScott Marcosがよりクリーンなソリューションを持っていると思います。 迅速な対応をありがとうございます。 ゲイリーC –

0

はこれを行うには、あなたがオブジェクトリテラルJavaScriptに文字列をオンにするJSONの解析メソッドを使用する必要があり、これはそれを行う方法です:

var arr = hwStr.split("+"); 
var temp_arr = null; 
var hwSpec = null; 
var stringToConv = '{'; //string to convert to object literal 

//iterate through the array 
for (var i = 0; i < arr.length; i++){ 
    temp_arr = arr[i].split("="); 
    stringToConv += '"' + temp_arr[0] + '":"' + temp_arr[1] + '"'; 

    //check if is the last string in the arr 
    if (i === arr.length - 1){ 
    stringToConv += '}' 
    } 
    else { //add comma 
    stringToConv += ","; 
    } 
} 

//convert to object using JSON 
hwSpec = JSON.parse(stringToConv); 

//your code here 
+0

* "JSONの解析メソッドを使用する必要があります" * - あなたは*する必要はありません*、それはそれを行う一つの方法です。しかし、もしあなたがJSONに変換しようとするならば、 'JSON.parse( '{' '+ hwStr.replace(/ =/g、'": "')).replace(/ \ +/g、'"、 "')+'"} ') '? – nnnnnn

+0

@nnnnnnしかし、この方法も完全に機能し、非常に高速です。 – Cocest

+0

実際には、有効なJSON(キーと値を引用符で囲まずに)が作成されず、 'JSON.parse()'がクラッシュするので、表示されたコードは機能しません。 – nnnnnn

関連する問題