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