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

有两个错误。第一个错误是在indexOf调用中:

var n = str.indexOf(fieldname);

这将始终返回大于或等于 0 的值,因为该字段存在于字符串中。你应该做的是:

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

第二个错误在你的if陈述中。它应该是:

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

或者

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

您要查找的子字符串很可能位于字符串的开头,在这种情况下,它的索引为 0。indexOf如果找不到您要查找的内容,则返回 -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('::'),因为我觉得 a.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");

但是如果你想要更多的东西,你可以把那个字符串解析成一个字典,像这样(小提琴):

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 回答