seeraig
asked on
Comparing 2 Lists Coldfusion
I have 2 lists with the same numbered elements, just in the 2nd list one list element has moved positions. I need to know how to find the original position of the moved list element (from List1) and the position it moved to (in List2) using Coldfusion. Here is an example
<List1 = '1,2,3,4,5'>
<List2 = '2,3,1,4,5'>
I need to know that "1" in List1 moved to the 3rd position in List2. Couple things to know
1. Each list will have the exact same numbers in them (ie list elements - 1,2,3,4,5), only in a different order
2. Only one list element will move, ie 1 moved to the 3rd position, no other list elements would change.
3. A list element can move forward or backwards, so the "1" could move the the 3rd position or the "5" could have moved to the 2nd position.
<List1 = '1,2,3,4,5'>
<List2 = '2,3,1,4,5'>
I need to know that "1" in List1 moved to the 3rd position in List2. Couple things to know
1. Each list will have the exact same numbers in them (ie list elements - 1,2,3,4,5), only in a different order
2. Only one list element will move, ie 1 moved to the 3rd position, no other list elements would change.
3. A list element can move forward or backwards, so the "1" could move the the 3rd position or the "5" could have moved to the 2nd position.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Edit:
Unfortunately not. It's impossible to derive which element moved, and in which direction, if all you have is the 2 lists. For example, if the new order were:
<List2 = '5,2,3,4,1'>
It could be that "1" was moved forward to the fifth position, or ... that "5" was moved backward to the first position. However, unless you know the element that was moved, It's impossible to tell which. If the lists were manipulated client side, like with drag and drop or something, you could capture the moved element before or during the move. But without that piece of information, you can't really derive it after the fact. Not from just the two lists.
Unfortunately not. It's impossible to derive which element moved, and in which direction, if all you have is the 2 lists. For example, if the new order were:
<List2 = '5,2,3,4,1'>
It could be that "1" was moved forward to the fifth position, or ... that "5" was moved backward to the first position. However, unless you know the element that was moved, It's impossible to tell which. If the lists were manipulated client side, like with drag and drop or something, you could capture the moved element before or during the move. But without that piece of information, you can't really derive it after the fact. Not from just the two lists.
ASKER
thanks again for your help on this. it's funny you mention drag and drop because that's what this is all about. So if you can just show me how to capture the moved element then I will be able to update things as I need to. I'm using this script below (the jquery version), what code do I need to capture the element that moved? The code automatically submits on drop event. The ajax goes to a coldfusion url that processes it, so I just need a way to capture the moved element into a coldfusion variable
https://davidwalsh.name/demo/drag-drop-sort-save-jquery.php
https://davidwalsh.name/demo/drag-drop-sort-save-jquery.php
UPDATE:
Ok, but why do you need to know the direction items moved? If this is just straight db storage, the typical method is to either update everything OR delete/re-insert. Then order or direction changes aren't an issue. Granted, updating only the records that moved can be slightly more efficient, in some cases, but it's also more complex and error prone.
My preference is the update all / delete/reinsert approach.
If you still want to go the other direction, I'm not familiar with the plugin, but a quick search says you can hook into the drop event
$( ".selector" ).droppable({
drop: function( event, ui ) {}
});
Then inside the function get the id of the moved element using:
$(ui.draggable).attr("id")
With the id, you can grab the value and store it in a hidden field. Then use it identify the direction:
it's funny you mention drag and drop because that's what this is all about.
Ok, but why do you need to know the direction items moved? If this is just straight db storage, the typical method is to either update everything OR delete/re-insert. Then order or direction changes aren't an issue. Granted, updating only the records that moved can be slightly more efficient, in some cases, but it's also more complex and error prone.
My preference is the update all / delete/reinsert approach.
I'm using this script below (the jquery version)
If you still want to go the other direction, I'm not familiar with the plugin, but a quick search says you can hook into the drop event
$( ".selector" ).droppable({
drop: function( event, ui ) {}
});
Then inside the function get the id of the moved element using:
$(ui.draggable).attr("id")
With the id, you can grab the value and store it in a hidden field. Then use it identify the direction:
<cfset List1 = "1,2,3,4,5">
<cfset List2 = "5,2,3,4,1">
<cfset movedItem = "5">
<cfset oldPos = listFindNoCase(list1, movedItem)>
<cfset newPos = listFindNoCase(list2, movedItem)>
<cfset direction = (oldPos lt newPos ? "forward" : "backward")>
<cfoutput>
#movedItem# moved #direction# from #oldPos# to #newPos#
</cfoutput>
ASKER
omg you're right, i was making this way more complicated than I needed to. I just updated all elements based off of the new sort list and it works fine, no issues.
ASKER
fast to respond and very helpful in alternatives ways of doing it.
Glad to help :)
ASKER
<cfset List1 = "1,2,3,4,5">
<cfset List2 = "5,1,2,3,4">
Here I would need to know that the 5 is the one that actually moved, the others are just moving in relation to the one that moved. but using your code it shows the "1" moved from the 1st position to the 2nd position
FROM 1
TO 2
VALUE 1