2017-07-20 4 views
7

jQueryとJavaScriptにかなり新しいので優しくしてください...アイテムがそのインデックス位置にある場合、javascript配列を更新するには?

私には、ユーザーが「列ヘッダー」のリストをドラッグ&ドロップすることができますここで、「列マッピング」ページを作成するために、POCに取り組んでいます新しい列見出しのグリッド。私はSQLデータベースに返すことができる配列を構築する必要があります。私はこの部分(ほとんど)が私の好きなように機能しています。

アイテムを左側の列リストから右側のヘッダーグリッドにドラッグすると、そのアイテムが存在する場合、コードはそのインデックスの配列アイテムを更新または置換する必要があります。アイテムが存在しない場合は、アイテムを配列に追加する必要があります。

例: "First Name"を "Headers"にドラッグすると、インデックス位置0に追加する必要があります。次に、 "First Name"を "with"にドラッグすると、インデックスの "First Name" 0を入力し、位置1に値を追加します。次に、「姓」を「with」にドラッグすると、位置1の配列が「姓」の値で更新されます。

$(document).ready(() => { 
 
    $(function() { 
 
    $('.item').draggable({ 
 
     cursor: "crosshair", 
 
     cursorAt: { 
 
     left: 5 
 
     }, 
 
     distance: 10, 
 
     opacity: 0.75, 
 
     revert: true, 
 
     snap: ".target", 
 
     containment: "window" 
 
    }); 
 
    }); 
 

 
    $(function() { 
 
    var array = []; 
 
    var arraytext = ''; 
 
    $('.target').droppable({ 
 
     accept: ".item", 
 
     tolerance: 'pointer', 
 
     activeClass: 'active', 
 
     hoverClass: 'highlight', 
 
     drop: function(event, ui) { 
 
     var dropped = $(this); 
 
     var dragged = $(ui.draggable); 
 
     $(function(index, item) { 
 
      var test = ''; 
 
      array.push($(dragged).text()); 
 
      arraytext = JSON.stringify(array); 
 
      test += "Index Value = " + $(dropped).index() + ", Text = " + $(dragged).text() + "<br/>"; 
 
      $('#test').html(test); 
 
      $('#array').text(arraytext); 
 
     }); 
 
     } 
 
    }); 
 
    }); 
 
});
#container { 
 
    border: solid black 1px; 
 
    margin: 0 auto; 
 
    height: 800px; 
 
} 
 

 
#gridview { 
 
    border: 2px solid #292da0; 
 
    border-radius: 5px; 
 
    background-color: #7577a3; 
 
    display: grid; 
 
    grid-template-columns: repeat(auto-fit, 100px); 
 
    grid-template-rows: auto; 
 
    margin-left: 105px; 
 
} 
 

 
.target { 
 
    border: 2px solid #1c1c3a; 
 
    border-radius: 5px; 
 
    background-color: #a7a7ef; 
 
    padding: 1em; 
 
} 
 

 
#flex { 
 
    border: 2px solid #292da0; 
 
    border-radius: 5px; 
 
    width: 100px; 
 
    background-color: #7577a3; 
 
    display: flex; 
 
    flex-flow: column wrap; 
 
    justify-content: flex-end; 
 
    float: left; 
 
} 
 

 
.item { 
 
    border: 2px solid #1c1c3a; 
 
    border-radius: 5px; 
 
    background-color: #a7a7ef; 
 
    padding: 1em; 
 
} 
 

 
.active { 
 
    background-color: blue; 
 
    color: white; 
 
    border: 2px solid black; 
 
} 
 

 
.highlight { 
 
    background-color: yellow; 
 
    color: black; 
 
    border: 2px solid blue; 
 
} 
 

 
.table { 
 
    border: solid black 1px; 
 
    width: 86px; 
 
    padding: 5px; 
 
}
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> 
 
<script src="https://code.jquery.com/ui/1.12.0/jquery-ui.min.js"></script> 
 
<div id="container"> 
 
    Test: 
 
    <div id="test"> 
 
    </div> 
 
    Array: 
 
    <div id="array"> 
 
    </div> 
 
    <div id="gridview"> 
 
    <div class="target">Headers</div> 
 
    <div class="target">with</div> 
 
    <div class="target">different</div> 
 
    <div class="target">column</div> 
 
    <div class="target">names</div> 
 
    </div> 
 
    <span> 
 
    <div id="flex"> 
 
    <div class="item">First Name</div> 
 
    <div class="item">Last Name</div> 
 
    <div class="item">Code</div> 
 
    <div class="item">Date</div> 
 
    <div class="item">Amount</div> 
 
    </div> 
 
    <table> 
 
    <thead> 
 
     <tr> 
 
     <td class="table">Some</td> 
 
     <td class="table">Column</td> 
 
     <td class="table">Data</td> 
 
     <td class="table">Goes</td> 
 
     <td class="table">Here</td> 
 
     </tr> 
 
    </thead> 
 
     <tr> 
 
     <td class="table">Other Data</td> 
 
     <td class="table">Other Data</td> 
 
     <td class="table">Other Data</td> 
 
     <td class="table">Other Data</td> 
 
     <td class="table">Other Data</td> 
 
     </tr> 
 
    </table> 
 
    </span> 
 
</div>

JSFiddle:あなたは任意の赤い旗や「落とし穴」に気づいたらhttps://jsfiddle.net/qxwzcn9w/4/

は最終的に私はボーナスポイントして戻ってデータベースにインデックス値を送信します。ありがとう!

+1

提出配列に値をプッシュします。代わりにso:array [index] = valueのような値を追加すると、必要なものが得られます。割り当てられた値の間の割り当てられていないインデックスは自動的に未定義に設定されるため、データベースは予想よりも短い配列とともにそれを処理する必要があります。 – Chairs

+0

アイデア:どの要素が配置されているかをチェックして、配列に "First Name"の値が0の配列を設定した場合( "First First Element")、 "First Name" "First Name"の値は1に設定されます。そして、送信ボタンのあとで配列から位置を読み取り、dbに送信します。私はこれが理解できることを願っています^^ –

+0

@ Chairs回答に感謝します。私はあなたが解決策にいると思います。 gridview divの要素の数に基づいて、いくつかのインデックス/空の文字列を持つ配列を作成する方法はありますか? –

答えて

1

シンプルなソリューションを要素が存在するかどうかを見つけるためにforループを使用しました。 jQueryに慣れている場合は、$.each()を使用することもできます。必要に応じて、$("thead").find("td")を使用してテーブルのヘッダー列を数えることによって、配列の長さを数えることができます。その後、通常のようにビジネスが繰り返され、要素が存在するかどうかが確認されます。削除されている場合は、適切なインデックスに挿入します。

$(function() { 
    $('.item').draggable({ 
    cursor: "crosshair", 
    cursorAt: { 
     left: 5 
    }, 
    distance: 10, 
    opacity: 0.75, 
    revert: true, 
    snap: ".target", 
    containment: "window" 
    }); 
}); 

$(function() { 
    var arraytext = ''; 
    $('.target').droppable({ 
    accept: ".item", 
    tolerance: 'pointer', 
    activeClass: 'active', 
    hoverClass: 'highlight', 
    drop: function(event, ui) { 
     var dropped = $(this); 
     var dragged = $(ui.draggable); 
     $(function(index, item) { 
     var test = ''; 

     for(var i = 0; i < array.length; i++) 
     { 
      if($(dragged).text() == array[i]) 
      { 
      array[i] = ""; 
      } 
     } 
     array[$(dropped).index()] = $(dragged).text(); 
     arraytext = JSON.stringify(array); 
     test += "Index Value = " + $(dropped).index() + ", Text = " + $(dragged).text() + "<br/>"; 
     $('#test').html(test); 
     $('#array').text(arraytext); 
     }); 
    } 
    }); 
}); 
1
array.push($(dragged).text()); 

この行は、ドロップされた列を更新しないで配列にプッシュしています。

各列ヘッダーの空の値のどこかで配列を初期化することから始めてください。

var arr = Array.apply(null, new Array(10)).map(Number.prototype.valueOf,0); 
//console.log(arr) Outputs as [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

番号は、使用している列の数に変更してください。指定されたインデックスの値を変更するには

は行います

arr[3]='a new value'; 
//console.log(arr) Outputs as [0, 0, 0, 'a new value', 0, 0, 0, 0, 0, 0] 
+1

'new Array(10).fill(0);' 10回の0で配列を作成する方がよさそうです。 – baao

2

個人的に私は、配列の代わりにオブジェクトを使用して、バックエンドの配列を持っている必要がある場合は、オブジェクト

var cols ={}; 

    $('.target').droppable({ 
    ..... 
    drop: function(event, ui) { 
     var txt = $(ui.draggable).text(), 
      colIdx = $(this).index(); 
     // clear from any prior position 
     $.each(cols, function(key, val){ 
     if (val === txt){ 
      cols[key] = null 
     } 
     }); 
     // add to new position 
     cols[colIdx] = txt;   

    } 
    }).each(function(i){ 
    // add each index as key in cols object 
    cols[i] = null; 
    }); 

ためのキーとしてインデックスを使用する直前のアレイに反対のcolsをマップすることは簡単ですそれはあなたがチュあるように見える

DEMO

+0

この場合、オブジェクトと配列を使用するメリットは何ですか? –

+0

この場合、実際の利点があるかどうかはわかりませんが、一般的に言えば、配列内では、他の位置から相対的に特定の位置にアクセスしているので、ヘッダーの位置が変わった場合は配列を変更する必要がありますそれを補うためにキーを使用すると、ヘッダーを変更することができ、コードを変更する必要はありません。 –

関連する問題