Javascript用于拆分和返回字符串值的函数

时间:2012-09-26 17:03:06

标签: javascript

我想抓住一定的价值。我是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);

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

这是有效的,这是我的fiddle

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('::'),因为我觉得.substring(...)会更容易。

答案 2 :(得分:2)

正则表达式可能更具吸引力。这是一个fiddle

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"]);​