2016-07-19 13 views
-1

(0、0)にある親のアイテムがあります。 アイテムは子供を持ち、その位置は親のに対して格納されています。たとえば、children[2]の位置は(2、-8)です。プロパティ値の計算でJavascriptオブジェクトをソート

を移動させることができる、そしてそれがないとき、それは正味の移動がmovementdelta_xdelta_yに格納されます。最初の例では、親のが右に移動しています.1、上に0です。このアイテムは右に動いていると言えます。 2番目の例では、親のが右に移動しています.1、上に-2です。このアイテムは、動きの右下が動きの下よりも小さいので、下に移動していると言うことができます。

は私がが右に移動している場合は左に、子供が右にソートされるようにchildrenをソートする必要があります。以下では、2つのシナリオとその期待される出力を掲載しました。

Example image

var children = { 
    2: { 
     relative_position_x: 2, 
     relative_position_y: -4 
    }, // Positioned at (2, -4) 
    4: { 
     relative_position_x: 0, 
     relative_position_y: -3 
    }, // Positioned at (0, -3) 
    1: { 
     relative_position_x: 2, 
     relative_position_y: 0 
    } // Positioned at (2, 0) 
}; // Relative to (0, 0) 

var movement = { 
    delta_x: 1, 
    delta_y: 0 
}; // Item is moving east (right) 

// Another possible scenario, expecting output to be [2, 4, 1] 
// var movement = { 
//  delta_x: 1, 
//  delta_y: -2 
// }; // Item is moving south (forget about (east) delta_x because it's a smaller movement than delta_y) 

console.log(sortedChildren); // expected [1, 2, 4] or [2, 1, 4] (from right-left) 

答えて

0

これは、項目が(delta_xとdelta_yが同じ値を持つ)斜めに起こっている場合を除き、私はまだこのインスタンスをソートする方法がわからないよ、すべてをサポートします。

var children = { 
    2: { 
     relative_position_x: 2, 
     relative_position_y: -4 
    }, // Positioned at (2, -4) 
    4: { 
     relative_position_x: 0, 
     relative_position_y: -3 
    }, // Positioned at (0, -3) 
    1: { 
     relative_position_x: 2, 
     relative_position_y: 0 
    } // Positioned at (2, 0) 
}; // Relative to (0, 0) 

var movement = { 
    delta_x: 1, 
    delta_y: 0 
}; // Item is moving east (right) 

var sortedChildren = []; 

for (var childrenId in children) { 
    if (Math.abs(movement.delta_x) == Math.abs(movement.delta_y)) { 
     // diagonal 
     console.log('Diagonal Movement: not supported'); 
    } else if (Math.abs(movement.delta_x) > Math.abs(movement.delta_y) && movement.delta_x > 0) { 
     // right 
     sortedChildren.push([children[childrenId], -children[childrenId].relative_position_x]); 
    } else if (Math.abs(movement.delta_x) > Math.abs(movement.delta_y) && movement.delta_x < 0) { 
     // left 
     sortedChildren.push([children[childrenId], children[childrenId].relative_position_x]); 
    } else if (Math.abs(movement.delta_x) < Math.abs(movement.delta_y) && movement.delta_y > 0) { 
     // up 
     sortedChildren.push([children[childrenId], -children[childrenId].relative_position_y]); 
    } else if (Math.abs(movement.delta_x) < Math.abs(movement.delta_y) && movement.delta_y < 0) { 
     // down 
     sortedChildren.push([children[childrenId], children[childrenId].relative_position_y]); 
    } 
} 

sortedChildren.sort(
    function(a, b) { 
     return a[1] - b[1]; 
    } 
); 

console.log(sortedChildren); 

Working JSFiddle

関連する問題