我创建了一个序列化列表(使用JQuery),然后想从列表中删除参数/值对。最好的方法是什么?我的代码似乎有点笨拙地处理参数/值对可能在列表的第一个,最后一个或中间的边缘条件。
function serializeDeleteItem(strSerialize, strParamName)
{
// Delete Parameter/Value pair from Serialized list
var strRegEx;
var rExp;
strRegEx = "((^[?&]?" + strParamName + "\=[^\&]*[&]?))|([&]" + strParamName + "\=[^\&]*)|(" + strParamName + "\=[^\&]*[&])";
rExp = new RegExp(strRegEx, "i");
strSerialize = strSerialize.replace(rExp, "");
return strSerialize;
}
的示例/测试装备
编辑:修改测试台以保留任何前导“?”或“&”这样该函数可以与URL查询字符串或序列化字符串片段
一起使用答案 0 :(得分:1)
这个版本比你的版本长,但是它更易于维护。它将查找并删除序列化参数,无论它在列表中的位置。
注意:
=
终止。break
一旦找到它。如果可能有更多,只需删除该行。function serializeDeleteItem(strSerialize, strParamName)
{
var arrSerialize = strSerialize.split("&");
var i = arrSerialize.length;
while (i--) {
if (arrSerialize[i].indexOf(strParamName+"=") == 0) {
arrSerialize.splice(i,1);
break; // Found the one and only, we're outta here.
}
}
return arrSerialize.join("&");
}
这会使您的一些测试失败 - 序列化字符串以'?'开头的测试或'&'。如果您认为这些是有效的,那么您可以在函数开始时执行此操作,并且所有测试都将通过:
if (strSerialize.length && (strSerialize[0] == '?' || strSerialize[0] == '&'))
strSerialize = strSerialize.slice(1);
我整理了一个test in jsperf来比较正则表达式方法和这个字符串方法。据报道,在32位Win7的IE10中,正则表达式解决方案比字符串慢49%。