2016-10-10 94 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中玩數組。所以我有一個數組「物體」的對象,其中有一個「孩子」的數組。上面張貼的代碼是其中的一個孩子。當每個元素可以引用數組中的索引時移除數組元素

現在我已經寫了一些JavaScript來刪除基於shapeId與.filter()方法的某些孩子,但這會產生一個問題與「childA」和「childB」值指向某個特定的索引孩子們陣列。值得注意的是,並非childs數組中的所有元素都具有child *屬性。我很難考慮如何完成刪除一個元素,然後修復childs數組中其他元素的「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值,那麼您可能必須更新刪除元素後面的所有元素才能使用索引-1。 – Malk

回答

0

就個人而言,我會避免直接使用索引,因爲它可能會非常棘手,讓他們跟上時代的一個可靠的途徑;一種可能的選擇是將一些'id'字段添加到對象中,以便可以獨立於陣列上的位置訪問它;您也可以擁有一個包含ID作爲鍵的輔助對象,並且該對象將自己引用爲值,以加快訪問速度。

數據結構化的方式dos看起來不太適合編輯,所以如果意圖使得某些東西變得非常簡單,直接對原始結構直接進行激活纔會是可行的。對於更復雜的編輯,將其轉換爲內部更方便的表示形式,在其上進行更改,然後將其轉換回原始表示形式,實際上可以節省調試頭痛的時間。

+0

該對象實際上是由視頻遊戲創建的,作爲創作的藍圖,所以我無法改變一個孩子如何引用另一個。 –

+0

我明白了......那麼,你打算如何使用這個對象呢?由於其結構化的方式,它不適合編輯,所以如果你正在做一些非常簡單的事情,直接對原始結構進行激勵只會是可行的;如果您打算進行復雜的編輯,然後將編輯後的結果保存回來,將其轉換爲內部更方便的表示形式,然後再進行修改,然後將其轉換回原始表示形式,這實際上可以節省您的時間。 –

+1

總的來說,我的意圖是從childs數組中刪除所有使用childs數組上的.filter方法的項目,但它一直讓我在遊戲中出現無效的藍圖。將問題追查到那些childA (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各的childs數組檢查相應的shapeId。這會導致關節數組(與body(& childs)數組分開)指向childs數組中的錯誤索引。 Haroldo_OK讓我走上正確的軌道來解決這個問題。幾分鐘前,它打我,我沒有保持我的整體孩子數(oChildCount:P)準確時,我會刪除一個孩子。所以我每次刪除一個孩子時都會減少這個數字!有用!

非常感謝,Haroldo_OK