2016-10-10 16 views
1
{ 
    "childA": 156, 
    "childB": 2422, 
    "color": "df7f00", 
    "id": 124, 
    "posA": { 
     "x": 5, 
     "y": -46, 
     "z": 11 
    }, 
    "posB": { 
     "x": 5, 
     "y": -46, 
     "z": 11 
    }, 
    "shapeId": "4a1b886b-913e-4aad-b5b6-6e41b0db23a6", 
    "xaxisA": 1, 
    "xaxisB": 1, 
    "zaxisA": 2, 
    "zaxisB": 2 
} 

最初にいくつかの重要なコンテキスト。 JavaScriptで配列を再生する。だから私は配列 "体"を持つオブジェクトを持っていて、それらの内部は "子"の配列です。上記のコードはその子の1つです。各要素が配列内のインデックスを参照できる場合の配列要素の削除

これで、.filter()メソッドでshapeIdに基づいて特定の子を削除するためのjavascriptをいくつか作成しましたが、これによって、 "childA"と "childB"の値が問題になります。チャイルド配列。子配列内のすべての要素に子*プロパティがあるわけではないことに気付くかもしれません。私は非常に困難な時間をどのように1つの要素を削除し、その結果としてスローされる子要素の配列内の他の要素の "childA"、 "childB"などの値を固定することを考えている。

私は、削除された要素の後の子を参照し、それを調整する削除された要素の前に子要素をチェックする必要があると思います。また、配列から削除される要素への参照を削除する必要があります。私はこれを達成する方法を考え出すことはできません。

私が学んでいるように私の無知を許してください、そして何か助けてくれてありがとう。ここで

は、最初の数チャイルズを持つオブジェクトです。個人的に

{ 
"bodies": [{ 
    "childs": [{ 
     "color": "560202", 
     "controller": { 
      "audioIndex": 1, 
      "controllers": null, 
      "id": 28253, 
      "joints": null, 
      "pitch": 1, 
      "volume": 100 
     }, 
     "pos": { 
      "x": -13, 
      "y": -18, 
      "z": 3 
     }, 
     "shapeId": "4c6e27a2-4c35-4df3-9794-5e206fef9012", 
     "xaxis": 2, 
     "zaxis": 1 
    }, { 
     "color": "0a1d5a", 
     "controller": { 
      "audioIndex": 1, 
      "controllers": null, 
      "id": 28248, 
      "joints": null, 
      "pitch": 1, 
      "volume": 100 
     }, 
     "pos": { 
      "x": 16, 
      "y": -13, 
      "z": 3 
     }, 
     "shapeId": "4c6e27a2-4c35-4df3-9794-5e206fef9012", 
     "xaxis": 1, 
     "zaxis": -2 
    }, 
+0

これはオブジェクトではありませんか? –

+1

配列を追加してください、あなたが話している。 –

+0

これらがid値ではなくインデックス値である場合は、削除された要素の後のすべての要素をindex-1を使用するように更新する必要があります。 – Malk

答えて

0

信頼性の高い方法で最新それらを維持することは非常に難しいことができているので、私は、直接インデックスを使用して避けるだろう。 1つの可能な代替案は、オブジェクトにいくつかの 'id'フィールドを追加することです。そのため、配列の位置から独立してアクセスすることができます。アクセスを高速化するために、キーとしてIDを含む馴染みのあるオブジェクトを持ち、オブジェクトとして値を参照することもできます。

データがどのように構成されているかは、編集にはあまり適していないように見えるので、元の構造に直接影響を与えることは、意図が非常に単純なものになっている場合にのみ有効です。より複雑な編集を内部のより便利な表現に変換し、その上に変更を加えて元の表現に戻すと、実際には頭痛のデバッグという点で時間を節約することができます。

+0

オブジェクトは実際に作成の青写真としてビデオゲームによって作成されるので、子供が他の子をどのように参照するかを変更することはできません。 –

+0

私は見る...そう、あなたは何のためにオブジェクトを使用するつもりですか?それが構造化されているので、編集するのが非常に難しいので、元の構造に直接触れることは、何かを非常にシンプルにしている場合にのみ実行可能です。複雑な編集をして編集した結果を元に戻し、内部のより便利な表現に変換し、その上に変更を加えて元の表現に戻すと、実際に時間が節約できます。 –

+1

全体的な意図は、子配列の.filterメソッドを使って行っていた子配列から特定の型のすべての項目を削除することでしたが、無効な青写真をゲームに残してしまいました。 (childBなど)のIDを指摘していなかったのは –

0

私が現在使用しているコードを投稿しただけで、実際に有効な青写真を実際に提供しています。あなた自身の質問に答えを投稿するのは悪いマナーではないことを願っていますが、現在はうまくいきます。私はそれを共有したいと思っています。そこにこれを処理する可能性がはるかに効率的な方法がありますが、ここで私が持っているものです:

function deleteObjects() { 
var IdCleanup = new Array(); 
objectCount = 0; 
var cleanupCount = 0; 
var jointCleanupCount = 0; 
var oChildIndex = 0; 

var childACleanup = 0; 
var childBCleanup = 0; 
var childCCleanup = 0; 

// Loop through the array manually and remove the id of elements being removed from thejson.bodies[i].childs[j].controller.controllers[*].id 
// fruits.splice(index, howmany); 

/* for(var i = 0; i < thejson.bodies.length; i++) { thejson.bodies[i].childs = thejson.bodies[i].childs.filter(checkObject); } */ 


/*************************************************************************************************************** 
To do list: 
1. Add thejson.bodies[*].childs[*].controller.id to IdCleanup list. 
2. Remove thejson.bodies[*].childs[*] 
3. Adjust thejson.joints[*].childA, thejson.joints[*].childB, .... references. 

4. Remove thejson.bodies[*].childs[*].controller.controllers[*].id values in the IdCleanup list. 
***************************************************************************************************************/ 



// One pass to delete the child objects, and add the deleted child's IDs to list. 
for(var i = 0; i < thejson.bodies.length; i++) { 
    for(var j = 0; j < thejson.bodies[i].childs.length; j++) { 

     // Shape matches dropdown menu value. 
     if(thejson.bodies[i].childs[j].shapeId == document.getElementById("mySelect").value) { 

      if(IdCleanup.indexOf(thejson.bodies[i].childs[j].controller.id) == -1) { 
       // Add this ID to the list of ones to remove. 
       IdCleanup[IdCleanup.length] = thejson.bodies[i].childs[j].controller.id; 
      } 

      // Remove this child. 
      thejson.bodies[i].childs.splice(j, 1); 
      j--; 
      oChildIndex--;// Keeping the overall index accurate. 

      // Adjust joints array. 
      if(thejson.joints != undefined) { 
       for(var k = 0; k < thejson.joints.length; k++) { 
        if(thejson.joints[k].childA) { 
         var idx = thejson.joints[k].childA; 

         if(idx < oChildIndex) { 

         } else if(idx > oChildIndex) { 
          thejson.joints[k].childA--; 
          jointCleanupCount++; 
          childACleanup++; 
         } else if(idx == oChildIndex) { 

         } 
        } 

        if(thejson.joints[k].childB) { 
         var idx = thejson.joints[k].childB; 

         if(idx < oChildIndex) { 

         } else if(idx > oChildIndex) { 
          thejson.joints[k].childB--; 
          jointCleanupCount++; 
          childBCleanup++; 
         } else if(idx == oChildIndex) { 

         } 
        } 

        if(thejson.joints[k].childC) { 
         var idx = thejson.joints[k].childC; 

         if(idx < oChildIndex) { 

         } else if(idx > oChildIndex) { 
          thejson.joints[k].childC--; 
          jointCleanupCount++; 
          childCCleanup++; 
         } else if(idx == oChildIndex) { 

         } 
        } 
       } 
      } 
      objectCount++; 
     } 

     oChildIndex++; 
    } 
} 

// Second pass for cleaning up the IDs from thejson.bodies[i].childs[j].controller.controllers that need removed. 
for(var i = 0; i < thejson.bodies.length; i++) { 
    for(var j = 0; j < thejson.bodies[i].childs.length; j++) { 
     var object = thejson.bodies[i].childs[j]; 

     // Check for controllers 
     if(thejson.bodies[i].childs[j].controller && thejson.bodies[i].childs[j].controller.controllers != null) { 
      for(var k = 0; k < thejson.bodies[i].childs[j].controller.controllers.length; k++) { 

       if(IdCleanup.indexOf(thejson.bodies[i].childs[j].controller.controllers[k].id) != -1) { 
        // one of the controllers match an ID of one that was deleted. 

        var idx = IdCleanup.indexOf(thejson.bodies[i].childs[j].controller.controllers[k].id); 

        thejson.bodies[i].childs[j].controller.controllers.splice(k,1); 
        k--; 
        cleanupCount++; 
       } 
      } 
     } 
    } 
} 

var processLog = document.getElementById('processLog'); 
processLog.value = processLog.value +"\n"+ objectCount +" objects deleted.\n"; 
processLog.value = processLog.value + cleanupCount +" ID cleanup operations.\n"; 
processLog.value = processLog.value + jointCleanupCount +" joint cleanup operations.\n"; 
processLog.value = processLog.value + childACleanup +" A, "+ childBCleanup +" B, "+ childCCleanup +" C\n"; 

}

はもともとこれは体の配列によってちょうどループし、その後のそれぞれに.filter使用していましたチャイルド配列は対応するshapeIdをチェックします。これにより、ジョイント配列(ボディ(&子)配列とは別)が子配列の間違ったインデックスを指すようになりました。 Haroldo_OKはそれを修正するために私を正しい軌道に乗せました。数分前、私は子供を取り除くときに全体的な子供の数(oChildCount:P)を正確に保っていないということが私を襲った。だから、私は子供と恋人を取り除くたびにその数を減らします!できます!

ありがとう、Haroldo_OK

関連する問題