0

I make a serialized list (with JQuery) and then want to delete a Parameter/Value pair from the list. What's the best way to do this? My code seems kinda clunky to take care of edge conditions that the Parameter/Value pair might be first, last, or in the middle of the list.

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;
}

Examples / Test rig at http://jsfiddle.net/7Awzw/

EDIT: Modified the test rig to preserve any leading "?" or "&" so that function could be used with URL Query String or fragment of serialized string

See: http://jsfiddle.net/7Awzw/5/

4

1 回答 1

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);

性能比较

在 jsperf 中进行了测试,以将正则表达式方法与此字符串方法进行比较。据报道,在 32 位 Win7 上的 IE10 中,正则表达式解决方案比字符串慢 49%。

于 2013-04-26T03:21:07.800 回答