2016-08-24 131 views
0

我有包含多個對象的JavaScript對象,其中一個屬性是sortOrder。更新一個對象sortOrder時,更新所有值的最有效方法是什麼?通過對象的子值對對象進行排序和更新

父是一個包含對象的子對象,像這樣:

parent.children = Object{11: Object, 12: Object, 13: Object} 

兒童對象是結構如下所示:

11: Object 
     sortOrder : "1" 

12 : Object 
     sortOrder : "2" 

13 : Object 
     sortOrder : "3" 

所以,如果我說的更新對象13中將sortOrder 2那麼它看起來像這樣:

11 : Object 
     sortOrder : "1" 

12 : Object 
     sortOrder : "2" 

13 : Object 
     sortOrder : "2" 

但我需要更新兄弟對象反映新增的sortorder,所以像這樣的:

11 : Object 
     sortOrder : "1" 

12 : Object 
     sortOrder : "3" 

13 : Object 
     sortOrder : "2" 

或者相反,如果我更新的對象11中將sortOrder 3,那麼其他的孩子就需要重新排列,像這樣:

11: Object 
     sortOrder : "3" 

Object 12 : 
     sortOrder : "1" 

Object 13 : 
     sortOrder : "2" 
+1

有沒有你不保存孩子作爲數組的一個原因(即既有秩序的概念,並有一個排序方法的結構)? –

+0

如果你想要有效的更新,你需要一個動態搜索樹結構來進行日誌操作,比如avl或者紅黑樹 – juvian

+1

對象子的順序不能保證,所以排序它沒有多大意義。我會使用一個'Object.keys()'的數組,然後根據孩子的值對它進行排序,然後使用排序後的鍵以特定的順序對孩子進行操作。 – pawel

回答

0

更新:新增描述。

您只需要修改當前您想要更改的元素的sortOrder和新的sortOrder之間的值的範圍,因此我們計算該範圍(低位&高位),然後修改對應的元素,最後更新目標元素的sortOrder。

var parent = {children: { 
 
    11: {sortOrder: "1"}, 
 
    12: {sortOrder: "2"}, 
 
    13: {sortOrder: "3"}, 
 
    14: {sortOrder: "4"} 
 
}}; 
 

 
function setSortOrderOfChildAt(key, newSortOrder){ 
 
    var child = parent.children[key]; 
 
    var childOrder = Number(child.sortOrder); 
 
    var low = Math.min(childOrder, newSortOrder); 
 
    var high = Math.max(childOrder, newSortOrder); 
 
    for(var childKey in parent.children){ 
 
    var sibling = parent.children[childKey]; 
 
    var siblingOrder = Number(sibling.sortOrder); 
 
    // assumes sortOrder is unique, this condition is equivalent to "if sibling !== child" 
 
    if(sibling.sortOrder !== child.sortOrder){ 
 
     if(siblingOrder >= low && siblingOrder <= high){ 
 
     sibling.sortOrder = "" + (siblingOrder + 1); 
 
     } 
 
    } 
 
    } 
 
    child.sortOrder = "" + newSortOrder; 
 
} 
 

 
console.log('initial:', parent.children); 
 
console.log('update Object 13 sortOrder to 2:'); 
 
setSortOrderOfChildAt(13, 2); 
 
console.log(parent.children);

0

old是孩子的原始排序順序開始發生變化。

nu成爲它正在改變的新排序順序。

遍歷每個孩子

  • 如果當前的孩子是一個,其排列順序是首先改變,然後再去做,即它的排序順序更改爲新值,nu
  • 否則,如果當前孩子的排序順序爲nuold之間然後:
    • 遞減,如果nu > old
    • 增量,如果nu < old

該算法採用絕對值並簽署爲此在一個簡潔的方式。

var parent = {children: { 
 
    11: {sortOrder: "1"}, 
 
    12: {sortOrder: "2"}, 
 
    13: {sortOrder: "3"}, 
 
    14: {sortOrder: "4"} 
 
}}; 
 

 
function setSortOrderOfChildAt(key, nu) { 
 
    var pc = parent.children; 
 
    var old = +pc[key].sortOrder; 
 
    var diff = nu - old; 
 
    for (var c in pc) { 
 
    var curr = +pc[c].sortOrder; 
 
    pc[c] = {sortOrder: (+c === key ? nu : (curr - (
 
     Math.abs((curr - nu) + (curr - old)) <= Math.abs(diff) ? Math.sign(diff) : 0 
 
    ))).toString()}; 
 
    } 
 
} 
 

 
console.log('initial:', parent.children); 
 
console.log('update Object 13 sortOrder to 2:'); 
 
setSortOrderOfChildAt (13, 2); 
 
console.log(parent.children);

相關問題