如何从序列化列表中删除项目?

时间:2013-04-26 02:40:04

标签: javascript serialization

我创建了一个序列化列表(使用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;
}

http://jsfiddle.net/7Awzw/

的示例/测试装备

编辑:修改测试台以保留任何前导“?”或“&”这样该函数可以与URL查询字符串或序列化字符串片段

一起使用

请参阅:http://jsfiddle.net/7Awzw/5/

1 个答案:

答案 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%。