2016-07-19 11 views
-1

Ich habe eine übergeordnete Artikel, positioniert um (0, 0). A übergeordnete Artikel hat Kinder, deren Positionen relativ zu der übergeordneten gespeichert sind. Zum Beispiel ist die Position children[2](2, -8).Javascript-Objekt durch Berechnung auf Eigenschaftswerte sortieren

Die Eltern bewegt werden kann, und wenn es funktioniert, dann ist es Netto-Bewegung in movement gespeichert ist, delta_x und delta_y. Im ersten Beispiel bewegt sich die übergeordnete nach rechts: 1, und nach oben: 0. Wir können sagen, dass dieser Artikel nach rechts bewegt. Im zweiten Beispiel bewegt sich das übergeordnete Element nach rechts: 1 und nach oben: -2. Wir können sagen, dass sich dieser Gegenstand nach unten bewegt, da seine Bewegung nach rechts kleiner ist als seine Bewegung nach unten.

muss ich children so sortieren, dass, wenn die Elternteil ist rechts bewegt, die Kinder rechts sortiert nach links. Im Folgenden habe ich zwei Szenarien und ihre erwarteten Ergebnisse veröffentlicht.

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) 

Antwort

0

Dies alles unterstützen wird, wenn der Artikel diagonal gehen wird (delta_x und delta_y den gleichen Wert haben), sie ist noch nicht sicher, wie diese Instanz zu sortieren.

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

Verwandte Themen