0

次の文字列を解析する必要があります。

"Apple-sweet#tangy@Bannana@Orange-citrusy@Pear-crispy#green/yellow"

「@」で始まる最初のアイテムを除く各アイテムがキーであり、「-」はそのキーのサブアイテムの開始を示します。「#」は、同じキーを持つ各サブアイテムを区切ります。

これに似たオブジェクトに:

{
"Apple": ["sweet", "tangy"],
"Bannana":[],
"Orange": ["citrusy"],
"Pear": ["crispy", "green/yellow"]
}

これを解析する最良の方法は何ですか?

4

4 に答える 4

5

文字列をガード記号で数回分割する必要があります。

var str = 'Apple-sweet#tangy@Bannana@Orange-citrusy@Pear-crispy#green/yellow';
var result = {};

str.split('@').forEach(function(item){
  var split = item.split('-'); 
  result[split[0]] = split[1] && split[1].split('#') || [];
});

console.dir(result);

最初に分割し@て、オブジェクトから各項目を個別の配列値として取得します。次に、その配列内の各項目を で分割して-、キーと値を取得します。その後、値が存在することを確認する必要があります。存在する場合は、それらを分割して#配列を取得します。

デモ: http://jsbin.com/avuGagu/1/edit

于 2013-11-05T16:24:32.367 に答える
3

これを試すことができます(例はこちら

var str = "Apple-sweet#tangy@Bannana@Orange#citrusy@Pear#crispy#green/yellow";
var arr = str.split('@'), i = 0, l= arr.length, obj = {} ;
for(; i< l; i++){
    var a = arr[i].split(/-|#/);
    obj[a[0]] = a.splice(1);
}
console.log(obj);

また、 (を使用してキーを作成するため、の代わりにlowercase使用できます)appleApple

obj[a[0].toLowerCase()] = a.splice(1);

例はこちら。

于 2013-11-05T16:29:03.220 に答える
1

多くの文字列操作関数が必要なだけです

var inputString = "Apple-sweet#tangy@Bannana@Orange-citrusy@Pear-crispy#green/yellow";
var keyValues = inputString.split("@");
var obj = {};

for (var i = 0; i < keyValues.length; ++i) {
    var index = keyValues[i].indexOf("-");
    if (index == -1) {
        obj[keyValues[i]] = [];
    } else {
        var key = keyValues[i].substring(0, index);
        var values = keyValues[i].substring(index + 1).split("#");
        obj[key] = values;
    }
}

フィドル

于 2013-11-05T16:18:53.747 に答える
0

楽しみのために、あなたの「文法」を PEG.js 内に実装しようとしました

http://pegjs.majda.cz/onlineにアクセスし、文法部分 (1) に次の文法を貼り付けます。

start
  = fruits

fruits
  = ft:fruit "@" fts:fruits  {fts[ft[0]] = ft[1]; return fts;}
  / ft:fruit {var fruits = {}; fruits[ft[0]] = ft[1]; return fruits;}

fruit
  = name:word "-" flavs:flavors {var ft = []; ft.push(name); ft.push(flavs); return ft;}
  / name:word {var ft = []; ft.push(name); ft.push([]); return ft;}

flavors
  = flavor:word "#" flavs:flavors {flavs.unshift(flavor); return flavs;}
  / flavor:word { var tab = []; tab.push(flavor); return tab;}

word
  = value:[a-zA-Z/]+ {return value.join("");}

次に、文章を入力セクションに入れます (2)

Apple-sweet#tangy@Bannana@Orange-citrusy@Pear-crispy#green/yellow

結果は次のとおりです。

{
   "Pear": [
      "crispy",
      "green/yellow"
   ],
   "Orange": [
      "citrusy"
   ],
   "Bannana": [],
   "Apple": [
      "sweet",
      "tangy"
   ]
}

次に、結果の JavaScript パーサーをファイルに埋め込みます。これにより、語彙/構文解析ジョブを気にする必要がなくなります。セマンティックレベルのIMHOでのみ機能するようになるための保守性が向上します:)

非常に強力な API ですが、この特定のケースでは少しやり過ぎです ;)

于 2013-11-05T17:12:38.937 に答える