0

(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/のテスト リグ

EDIT : 先頭の「?」を保持するようにテスト リグを変更しました。または "&" を使用して、URL クエリ文字列またはシリアル化された文字列のフラグメントで関数を使用できるようにする

参照: http://jsfiddle.net/7Awzw/5/

4

1 に答える 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 に答える