On 2016-03-25 08:33, Peter W A Wood wrote:
I have an array which contains a second array. (myArray[“numbers”][]).
The numbers array is a traditional array with elements 1..n. I want to
remove the first element of the numbers array and shuffle all the
others up. Is there a simple way of doing this in LiveCode (equivalent
to the shift() function in JavaScript)?
I looked in the dictionary and found delete <variable> but couldn't
get it to work, perhaps because I am trying to do this in a function
that takes the array as an argument.
The essence of the function is:
function shift @pList
local tItem
put pList[“numbers”][1] into tItem
delete pList[“numbers”] 1 ## Is this the
correct syntax?
return tItem
end shift
If I can get delete to remove the first element of the array, will it
automatically change the index of the remaining entries?
Hi Peter,
LiveCode arrays are actually dictionaries (more like JavaScript objects
than JavaScript arrays). There aren't currently any push/pop syntax for
LiveCode arrays.
I would recommend two things:
1) Arrange your algorithm so that you extract things one-by-one from the
_end_ of the numbered array, rather than the start. This is more
efficient! Then you would do something like:
function PopEnd @xArray
local tLength, tItem
put the number of elements in xArray into tLength
if tLength is 0 then return empty
put xArray[tLength] into tItem
delete xArray[tLength]
return tItem
end PopEnd
2) Alternatively, you can shift everything along, which will be slow:
function PopStart @xArray
local tLength, tItem, tKey
put the number of elements in xArray into tLength
if tLength is 0 then return empty
put xArray[1] into tItem
repeat with tKey = 2 to tLength
put xArray[tKey] into xArray[tKey - 1]
end repeat
delete xArray[tLength]
return tItem
end PopStart
3) Another option, if you don't care about what order you get your
values in, is to remove an item from anywhere, cheaply, by moving the
last item in the list on top of the one you've removed:
function RemoveAt @xArray, pIndex
local tLength, tItem
if pIndex is not among the keys of xArray then return empty
put the number of elements in xArray into tLength
put xArray[pIndex] into tItem
put xArray[tLength] into xArray[pIndex]
delete xArray[tLength]
return tItem
end RemoveAt
I hope that's helpful.
Would anyone be interested in a Feature Exchange for adding some new
array operators (such as push and pop) to the language?
Peter
--
Dr Peter Brett <peter.br...@livecode.com>
LiveCode Open Source Team
LiveCode 2016 Conference https://livecode.com/edinburgh-2016/
_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode