Javascript 如何从序列化列表中删除项目?
我创建了一个序列化列表(使用JQuery),然后想从列表中删除一个参数/值对。最好的方法是什么?我的代码似乎有点笨拙,要注意参数/值对可能是第一个、最后一个或在列表中间的边缘条件。Javascript 如何从序列化列表中删除项目?,javascript,serialization,Javascript,Serialization,我创建了一个序列化列表(使用JQuery),然后想从列表中删除一个参数/值对。最好的方法是什么?我的代码似乎有点笨拙,要注意参数/值对可能是第一个、最后一个或在列表中间的边缘条件。 function serializeDeleteItem(strSerialize, strParamName) { // Delete Parameter/Value pair from Serialized list var strRegEx; var rExp; strRegEx = "((^[?&am
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次查找时达到盈亏平衡点。似乎不值得把代码复杂化。