1

これについてはたくさんの質問があることは知っていますが、私の問題の解決策を見つけることができず、しばらくの間それを続けています。同じ名前の入力フィールドが2セットあります。1つは製品コード用で、もう1つは製品名用です。これらの入力フィールドは、ユーザーが削除してDOMに追加できるため、複数存在する可能性があります。

これが私がこれまでに持っているものですが、これはそれを保存するので、すべてのコードが1つの配列にあり、すべての名前が別の配列にあります。

var updatedContent = [];
var varCode = {};
var varName = {};

$('.productVariationWrap.edit input[name="varVariationCode[]"]')
   .each(function(i, vali){
     varCode[i] = $(this).val();
   });

$('.productVariationWrap.edit input[name="varVariationName[]"]')
  .each(function(i1, vali1){
    varName[i1] = $(this).val();
  });

updatedContent.push(varCode);
updatedContent.push(varName);

名前とコードが同じ配列に入るように取得しようとしています。つまり、コードはK = Vペアのキーですか?

基本的には、最終的な配列をループして、コードと関連する名前に簡単にアクセスできるようにします。

私はこれをPHPで非常に簡単に行うことができますが、javascriptではうまくいきません。

編集

配列を次のようにしたいと思います。

[
    [code1, name1],
    [code2, name2],
    [code3, name3]
];

したがって、ループを実行できた後、マスター配列内の各配列に対して、キー(たとえば、code1)と関連する値(たとえば、name1)を使用して何かを実行できます。これは意味がありますか?それは多次元配列のようなものですが、Javascriptに関してはそのステートメントの有効性に反対する人もいるかもしれません。

4

3 に答える 3

3

次のような場合は、ループせずに後でキーと値のペアにアクセスできるようにオブジェクトを作成する方がよいと思います。

var $codes = $('.productVariationWrap.edit input[name="varVariationCode[]"]'),
    $names = $('.productVariationWrap.edit input[name="varVariationName[]"]'),
    updatedContent = {};

for (var i = 0, il = $codes.length; i < il; i++) {
    updatedContent[$codes.get(i).value] = $names.get(i).value;
}

たとえば、、、updatedContent.code1 == name1必要に応じてオブジェクトをループできます。

for (var k in updatedContent) {
    // k == code
    // updatedContent[k] == name
}
于 2013-03-18T22:39:58.527 に答える
1

2つのループを使用することはおそらく最適ではありません。コードであれ名前であれ、すべてのアイテムを収集し、それらを一緒にアセンブルする単一のループを使用することをお勧めします。

別の問題:あなたのセレクターは私には少しおかしいように見えます。ページにこれらのコントロールが複数存在する可能性があるとおっしゃいましたが、入力の各ペアが独自の祖先内にない限り、コントロールが相互に排他的なラジオボタン/チェックボックスでない限り、名前が重複するのは正しくありません<form>か?これについての詳細は、私がより良い答えを提供するのに役立ちます。

注:コードでは、varCode変数とvarName変数をオブジェクトとしてインスタンス化しました{}が、配列のように使用します[]。それはあなたが意図したことですか?私が最初にあなたに答えたとき、私は「最終出力はこの配列のように見えるはずです」に気を取られ、オブジェクトにキー=値のペアが必要であることに気づきませんでした。最終結果がネストされた配列であることについてあなたが言ったことを本当に意味しているのであれば、コードをそのまま機能させるためにコードに加えることができる最小の変更は次のようになります。

var updatedContent = [];

$('.productVariationWrap.edit input[name="varVariationCode[]"]')
   .each(function(i, vali){
      updatedContent[i] = [$(this).val()]; //make it an array
   });

$('.productVariationWrap.edit input[name="varVariationName[]"]')
   .each(function(i1, vali1){
      updatedContent[i1].push($(this).val()); //push 2nd value into the array
   });

ただしCode、値に対して一意のインデックスを作成するName必要があるため、配列ではなくオブジェクトを使用する必要があります。CodeキーはName値です。

var updatedContent = {},
   w = $('.productVariationWrap.edit'),
   codes = w.find('input[name="varVariationCode[]"]'),
   names = w.find('input[name="varVariationName[]"]');

for (var i = codes.length - 1; i >= 0; i -= 1) {
   updatedContent[codes.get(i).val()] = names.get(i).val();
});

また、これによりオブジェクトが生成され、表記は次のようになることに注意してください。

{
    'code1': 'name1',
    'code2': 'name2',
    'code3': 'name3'
};

updatedContentこれで、次のようにオブジェクトを使用できます。

var code;
for (code in updatedContent) {
    console.log(code, updatedContent[code]); //each code and name pair
}

最後に、同じ順序で別々のjQueryオブジェクトに返される入力Codeと入力に依存するのは少し脆弱に思えます。Name適切なコードと適切な名前を関連付けていることを確認する方法は、私にとって重要だと思われます。現在の方法が正しく機能している場合でも、ページレイアウトの将来の改訂で何かが壊れることはないと誰が言いますか?ページ要素の順序に依存するのではなく、単純に明示的な相関関係を好むのですが、そのような確実性の必要性を感じないかもしれません。

于 2013-03-18T22:37:26.150 に答える
0

私は2つのループでそれを解決する方法が好きではありません

 var updatedContent = [] 

 $('.productVariationWrap.edit').each(function(i, vali){
     var $this = $(this)
     , tuple = [$this.find('input[name="varVariationCode[]"]').val()
                , $this.find('input[name="varVariationName[]"]').val()]

     updatedContent.push(tuple)
 });
于 2013-03-18T22:52:03.543 に答える