0

配列内の文字列トークンを検索する次のコードを作成しました。

var parseCSVLines = function(lines) {
    var valueObj = {};
    var delim  = ',';
    var isLayer = false;
    var isGroup = false;

    for(var i = 0; i < lines.length; i++){

      //skips CR/CF lines
      if(!lines[i]) continue;

      //only data lines reach this loop
      var data = lines[i].split(delim);

      /*********looks for tag*************/
      if(data[0] == '#L' || data[0] == '#l'){
        //on occasions, data[0] is '#L' or '#G' still execution reaches here
        isLayer = true;
      }else if(data[0] == '#G' || data[0] == '#g'){
        isGroup = true;
      }else{
        if(isLayer){
          valueObj[data[0]] = { 
            layerInfo: data[1] == 'on' ? true : false
          };
        }
        else if(isGroup){
          valueObj[data[0]] = { 
            GroupInfo: data[1] == 'on' ? true : false
          };
        }
      }

    }

    return valueObj;
};

行をループし、次の行をマークしてデータを取得します。奇妙なことに、 data[0]is'#L'との場合'#G'、最初のifステートメントが実行されます。私は何を間違えましたか?

4

2 に答える 2

1

if ステートメントは問題ありませんdata[0]='#G#L'data[0]=='#L'||data[0]=='#l'

私の考えでは、あなたは論理に固執しています-

 if (data[0] == '#L' || data[0] == '#l') {
     isLayer = true;
     //isGroup=false; you should toggle isGroup
 } else if (data[0] == '#G' || data[0] == '#g') {
     isGroup = true;
     //isLayer=false; you should toggle isLayer
 } else { //do you want else here??? This would pick the value of isLayer  or isGroup according to previous line processed but not the value according to current line being processed.
     if (isLayer) {
         valueObj[data[0]] = {
             layerInfo: data[1] == 'on' ? true : false
         };
     } else if (isGroup) {
         valueObj[data[0]] = {
             GroupInfo: data[1] == 'on' ? true : false
         };
     }
 }

例:

line1: '#L,hi'
line2:'#G,hi'
line3:'hi'

処理の最初の行が設定されますisLayer=true;

2行目の処理が設定されますisGroup=true;//remember isLayer is still true - you haven't set it to false;

3 行目を処理すると、else 部分がトリガーされます...最初の条件にif(isLayer)なります。true

それを機能させるには:

//update isLayer and isGroup for every iteration to keep the logic inline
isLayer=(data[0] == '#L' || data[0] == '#l');
isGroup=(data[0] == '#G' || data[0] == '#g');
if(!isLayer && !isGroup) {
     if (isLayer) {
         valueObj[data[0]] = {
             layerInfo: data[1] == 'on' ? true : false
         };
     } else if (isGroup) {
         valueObj[data[0]] = {
             GroupInfo: data[1] == 'on' ? true : false
         };
     }
 }
于 2015-01-28T03:19:50.830 に答える
0

これを試して:

if(data[0] == "#l" || data[0] == "#L") {
    if(data[0].search("#g") != -1 || data[0].search("#G") != -1){

    }else{
        isLayer = true;
    }
}else if(data[0] == "#g" || data[0] == "#G"){
    if(data[0].search("#l") != 0 || data[0].search("#L") != 0){

    }else{
        is group = true;
    }
}

ご覧のとおり、両方が存在するかどうかを確認していませんでした。私のコードが行うことは、それをチェックすることです

  1. アイテム#gまたは#lです
  2. アイテムも反対ではありません。

これにより、1 つのオプションのみが選択されるようになります。


こんばんは、そして頑張ってください。

于 2015-01-28T02:59:42.033 に答える