1

私は特定の値を取得しようとしています。私はjavascriptを初めて使用しますが、なぜこれが機能しないのか理解できません。

「kid_2」を解析すると、「kostas」が取得されます。「Kostas」の代わりに、私は常に「02-23-2000」を取得します。だから私はループで論理的な問題を抱えているに違いないが、私は本当に立ち往生している。

function getold_val(fieldname,str){

  var chunks=str.split("||");
  var allchunks = chunks.length-1;
     for(k=0;k<allchunks;k++){
       var n=str.indexOf(fieldname);
       alert(chunks[k]);
       if(n>0){
       var chunkd=chunks[k].split("::");
         alert(chunkd);
         return chunkd[1];
       }
     }
}
var test = getold_val('kid_2','date_1::02-23-2000||date_2::06-06-1990||kid_1::George||kid_2::Kostas||');

alert(test);
4

3 に答える 3

2

2つのバグがあります。最初のエラーはindexOf呼び出しにあります:

var n = str.indexOf(fieldname);

フィールドが文字列に存在するため、これは常に0以上の値を返します。あなたがすべきことは次のとおりです。

var n = chunks[k].indexOf(fieldname);

2番目のエラーはifステートメントにあります。そのはず:

if(n >= 0) {
   ...
}

また

if(n > -1) {
    ...
}

探している部分文字列は、文字列の先頭にある可能性が非常に高く、その場合、そのインデックスは0indexOfです。探しているものが見つからない場合は-1を返します。

そうは言っても、これがあなたがやろうとしていることをするためのより良い方法です:

function getold_val(fieldName, str) {
    var keyValuePairs = str.split("||");
    var returnValue = null;

    if(/||$/.match(str)) {
       keyValuePairs = keyValuePairs.slice(0, keyValuePairs.length - 1);
    }

    var found = false;
    var i = 0;
    while(i < keyValuePairs.length && !found) {
       var keyValuePair = keyValuePairs[i].split("::");

       var key = keyValuePair[0];
       var value = keyValuePair[1];

       if(fieldName === key) {
          returnValue = value;
          found = true;
       }

       i++;
    }

    return returnValue;
}
于 2012-09-26T17:07:28.560 に答える
2

これはうまくいきます、これが私のフィドルです。

function getold_val(fieldname,str) {
    var chunks = str.split('||');
    for(var i = 0; i < chunks.length-1; i++) {
        if(chunks[i].indexOf(fieldname) >= 0) {
            return(chunks[i].substring(fieldname.length+2));
        }
    }
}
alert(getold_val('kid_2', 'date_1::02-23-2000||date_2::06-06-1990||kid_1::George||kid_2::Kostas||'));

コードの問題は(@slebetmanも気づいたように)、文字列インデックスは最初の文字から正確に始まるため、0になる可能性があるという事実でした。

コードはあなたのものとほとんど同じです、私はより簡単.split('::')だと思ったので、私はちょうど2番目を使用しませんでした。.substring(...)

于 2012-09-26T17:08:12.557 に答える
2

正規表現はもう少し魅力的かもしれません。これがフィドルです:

function getValue(source, key){
    return (new RegExp("(^|\\|)" + key + "::([^$\\|]+)", "i").exec(source) || {})[2];
}    
getValue("date_1::02-23-2000||date_2::06-06-1990||kid_1::George||kid_2::Kostas||","kid_2");

しかし、もう少し複雑なものが必要な場合は、その文字列を次のように辞書に解析できます(fiddle):

function splitToDictionary(val, fieldDelimiter, valueDelimiter){
    var dict = {},
    fields = val.split(fieldDelimiter),
    kvp;
    for (var i = 0; i < fields.length; i++) {        
        if (fields[i] !== "") {
            kvp = fields[i].split(valueDelimiter);        
            dict[kvp[0]] = kvp[1];
        }
    }
    return dict;    
}
var dict = splitToDictionary("date_1::02-23-2000||date_2::06-06-1990||kid_1::George||kid_2::Kostas||","||","::");
console.log(dict["date_1"]);
console.log(dict["date_2"]);
console.log(dict["kid_1"]);
console.log(dict["kid_2"]);​
于 2012-09-26T17:52:46.427 に答える