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

Javascript 如何从序列化列表中删除项目?,javascript,serialization,Javascript,Serialization,我创建了一个序列化列表(使用JQuery),然后想从列表中删除一个参数/值对。最好的方法是什么?我的代码似乎有点笨拙,要注意参数/值对可能是第一个、最后一个或在列表中间的边缘条件。 function serializeDeleteItem(strSerialize, strParamName) { // Delete Parameter/Value pair from Serialized list var strRegEx; var rExp; strRegEx = "((^[?&am

我创建了一个序列化列表(使用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查询字符串或序列化字符串片段一起使用


请参阅:

此版本比您的版本长,但我认为它更易于维护。它将查找并删除序列化参数,而不管它在列表中的什么位置

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

    <> LI>为了避免在数组中间移除项的问题,我们以相反的方式迭代。
  • 为了精确匹配参数名,我们希望它们从拆分字符串的开头开始,并以
    =
    结束
  • 假设给定参数只有一个实例,一旦找到它,我们就
    break
    。如果可能还有更多,只需删除该行
代码 这会使您的一些测试失败-那些带有以“?”或“&”开头的序列化字符串的测试。如果您认为这些测试是有效的,那么您可以在函数开始时执行此操作,并且所有测试都将通过:

if (strSerialize.length && (strSerialize[0] == '?' || strSerialize[0] == '&'))
  strSerialize = strSerialize.slice(1);
性能比较
我已经准备了一个例子来比较正则表达式方法和这个字符串方法。据报道,在32位Win7上的IE10中,正则表达式解决方案比字符串慢49%。

谢谢。我确实考虑了拆分序列化字符串,很高兴看到一些代码来完成这项工作:我想知道是否有一种更快的方法来找到哪一个数组元素匹配?也许在strSerialize中计算参数前面的“&”数,而不是在数组本身循环?我不确定我是否需要对前导“&^”或“?”的支持,但我添加了它们,这样函数就可以支持查询字符串和序列化字符串片段。考虑javascript速度时,更重要的是,使用Apps脚本,仅计算代码行数或循环迭代次数是不够的——你真的需要测量它。为什么不在本文中比较这两种方法呢?根据我看到的其他测试,我希望字符串函数比正则表达式有优势。我已经编辑了O/P以保留任何领先的“?/”和“@Kristen-Done!我已经在问题中添加了jsperf测试的链接。@Kristen-由于列表未排序且很短,您不太可能击败O(n/2)循环。如果要进行多次搜索,可以对列表O(logn)进行排序,然后进行二进制搜索O(logn),在一个包含4个元素的列表中,大约有3次查找时达到盈亏平衡点。似乎不值得把代码复杂化。