2017-05-19 4 views
0

私は各行に4列を含む10行を持っていましたが、今はlocalStorageを使用してインポートした値を取得したいと思います。私はこれらのすべての値を独立して入れる方法を見つけますが、コードはすべて繰り返しです。これらはコードの冗長性を引き起こします。私はループを使用してコードを短縮する方法があるのだろうか?これらの重複するJavaScriptコードをループに短縮するにはどうすればよいですか?

document.getElementsByClassName("r1")[0].selectedIndex=res.r1[0]; 

...簡単な最初のパスの改善だけで"r1"の代わりに変数を使用して、ネストされたforループを使用するために、次のようになります。ここでは

はこの繰り返しの行を見てみると、私のコード

var res = {}; 
    $(function(){ 
    $('#subbtn').click(function() { 
     console.log($('#tab').find('tr')) 
     $('tr').each(function(){ 
      var tmp = []; 
      var cl ; 
      $(this).find('select').each(function(){ 
      cl = $(this).attr('class'); 
      //console.log(cl); 
      tmp.push($(this).val()); 
      }) 

      res[cl] = tmp 
     }) 
     console.log(res); 
     localStorage.setItem("testingvalue",JSON.stringify(res)); 
     document.getElementById("results__display").innerHTML = (localStorage.getItem("testingvalue")); 
    }) 

    }) 
    $(document).ready(function(){ 
    var res = {}; 
    try { 
    console.log('existed'); 
     res = JSON.parse(localStorage.getItem("testingvalue")); 

    //alert(res.r1[2]); 
    document.getElementsByClassName("r1")[0].selectedIndex=res.r1[0]; 
    document.getElementsByClassName("r1")[1].selectedIndex=res.r1[1]; 
    document.getElementsByClassName("r1")[2].selectedIndex=res.r1[2]; 
    document.getElementsByClassName("r1")[3].selectedIndex=res.r1[3]; 

    document.getElementsByClassName("r2")[0].selectedIndex=res.r2[0]; 
    document.getElementsByClassName("r2")[1].selectedIndex=res.r2[1]; 
    document.getElementsByClassName("r2")[2].selectedIndex=res.r2[2]; 
    document.getElementsByClassName("r2")[3].selectedIndex=res.r2[3]; 

    document.getElementsByClassName("r3")[0].selectedIndex=res.r3[0]; 
    document.getElementsByClassName("r3")[1].selectedIndex=res.r3[1]; 
    document.getElementsByClassName("r3")[2].selectedIndex=res.r3[2]; 
    document.getElementsByClassName("r3")[3].selectedIndex=res.r3[3]; 

    document.getElementsByClassName("r4")[0].selectedIndex=res.r4[0]; 
    document.getElementsByClassName("r4")[1].selectedIndex=res.r4[1]; 
    document.getElementsByClassName("r4")[2].selectedIndex=res.r4[2]; 
    document.getElementsByClassName("r4")[3].selectedIndex=res.r4[3]; 

    document.getElementsByClassName("r5")[0].selectedIndex=res.r5[0]; 
    document.getElementsByClassName("r5")[1].selectedIndex=res.r5[1]; 
    document.getElementsByClassName("r5")[2].selectedIndex=res.r5[2]; 
    document.getElementsByClassName("r5")[3].selectedIndex=res.r5[3]; 

    document.getElementsByClassName("r6")[0].selectedIndex=res.r6[0]; 
    document.getElementsByClassName("r6")[1].selectedIndex=res.r6[1]; 
    document.getElementsByClassName("r6")[2].selectedIndex=res.r6[2]; 
    document.getElementsByClassName("r6")[3].selectedIndex=res.r6[3]; 

    document.getElementsByClassName("r7")[0].selectedIndex=res.r7[0]; 
    document.getElementsByClassName("r7")[1].selectedIndex=res.r7[1]; 
    document.getElementsByClassName("r7")[2].selectedIndex=res.r7[2]; 
    document.getElementsByClassName("r7")[3].selectedIndex=res.r7[3]; 

    document.getElementsByClassName("r8")[0].selectedIndex=res.r8[0]; 
    document.getElementsByClassName("r8")[1].selectedIndex=res.r8[1]; 
    document.getElementsByClassName("r8")[2].selectedIndex=res.r8[2]; 
    document.getElementsByClassName("r8")[3].selectedIndex=res.r8[3]; 

    document.getElementsByClassName("r9")[0].selectedIndex=res.r9[0]; 
    document.getElementsByClassName("r9")[1].selectedIndex=res.r9[1]; 
    document.getElementsByClassName("r9")[2].selectedIndex=res.r9[2]; 
    document.getElementsByClassName("r9")[3].selectedIndex=res.r9[3]; 

    document.getElementsByClassName("r10")[0].selectedIndex=res.r10[0]; 
    document.getElementsByClassName("r10")[1].selectedIndex=res.r10[1]; 
    document.getElementsByClassName("r10")[2].selectedIndex=res.r10[2]; 
    document.getElementsByClassName("r10")[3].selectedIndex=res.r10[3]; 

    } 

    catch (error){ 
     console.log(error.message); 
    } 


}); 
+1

は、私は** ''のgetElementsByClassName内** ''のgetElementsByClassNameの長さと長さを取得する方法がわからないループ – tyler

+0

、FORSを使用してください。私は10行を持っていたことを意味し、各行は4列を持っていた。 forループを使用できるように、列のサイズを取得する方法を教えてください。 – Beginner

+0

あなたがそれらを抽出したのと同じように設定することができます。すべての行をループし、それらの行のすべての 'select'要素をループします。 'select'要素のループでは、' $(this)).val(res [cl] [$(this).index()]) ' – Titus

答えて

1

ですおよび0

for (var r = 1; r <= 10; r++) { 
    for (var i = 0; i < 4; i++) { 
    document.getElementsByClassName("r" + r)[i].selectedIndex = res["r" + r][i]; 
    } 
} 

いいえ

var els; 
for (var r = 1; r <= 10; r++) { 
    els = document.getElementsByClassName("r" + r); 
    for (var i = 0; i < 4; i++) { 
    els[i].selectedIndex = res["r" + r][i]; 
    } 
} 

第二のバージョン内で:外側のループにそれを移動する方が良いだろう - これは.getElementsByClassName("r" + r)コールは非常に効率的ではないれ、rの各値のための4つの時間に発生意味しかしTICE、ループはi < 4ではなくi < els.lengthと言うことができますが、どちらの方法でも、HTML要素の数とresオブジェクトの項目数を一致させる必要があります。

res = JSON.parse(localStorage.getItem("testingvalue")); 
    // Let's start with checking 'res' type. 
    // - if it's an Array, get the the length from .length 
    // - if it's Object, get the the length from Object.keys().length 
    var resLength = Array.isArray(res) ? res.length : typeof res === 'object' ? Object.keys(res).length : 0; 
    // loop throw the rows. 
    for (var i = 0; i < resLength; i++) { 
    // Do the same as above: get type of the row and calculate it length for the loop. 
    var rowLength = Array.isArray(res[i]) ? res.length : typeof res[i] === 'object' ? Object.keys(res[i]).length : 0; 
    // loop throw the columns on the row. 
    for (var j = 0; j < rowLength; j++) { 
     document.getElementsByClassName('r'+i)[j].selectedIndex=res['r'+i][j]; 
    } 
} 
+0

はい、これは簡単でわかりやすいです。 '。 – Beginner

+0

私は、 '.getElementsByClassName() 'の繰り返し呼び出しを削除するために編集するつもりですが、実際には同じことが分かっています。( – nnnnnn

+0

私はこれがすでに私のために働いていると思う:) – Beginner

0

次のコードは、ストレージ内のデータのサイズに関係なく動作します。 jQueryを使用すると、これがはるかに簡単になります。ここで

は一例です。もちろん

var res = JSON.parse(localStorage.getItem("testingvalue")); 
$("tr select").each(function(){ 
    $(this).val(res[$(this).attr("class")][$(this).index()]); 
}); 

select要素が一つだけのクラス名とresオブジェクトがtr要素内にあるすべてのselectの要素の値が含まれている場合、これはのみ動作します。あなたの質問のjQueryコードに基づいているようです。

そして、これは、より安全なアプローチである

Object.keys(res).forEach(function(key){ 
    res[key].forEach(function(val, index){ 
     $("tr select." + key).eq(index).val(val); 
    }); 
}); 
+0

私はこれもこのように書くつもりだったが、私が書いたものは正しい入力を得ることができない。ありがとう、私はあなたのコードを試して、それは私のために働いていませんでした:( – Beginner

+0

'res'は配列ではないオブジェクトです、最初のループの条件は' i Titus

+0

Ermm、まだできません。しかし**キー**は私が好きな名前をつけることができるか、デフォルトのものですか? 'Object.keys(res [i])。length)'? – Beginner

0

あなたはjQueryライブラリがロードされているように見えるしました:

+0

しかし、もし私がクラスで2つの名前を得たら?私はちょうど私の更新されたコードを取得し、私のクラス名は2になったので。 – Beginner

+0

@Beginner 2番目のアプローチを使用することもできますが、ローカルストレージに保存するオブジェクトを作成するjQueryコードも変更する必要があります。このコードは '$(this).attr(" class ")'(すべてのクラス名)をプロパティとして使用してオブジェクトを生成します。 – Titus

関連する問題