Delete the first entry of an array.

Peter TB Brett peter.brett at livecode.com
Fri Mar 25 04:03:31 EDT 2016


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.brett at livecode.com>
LiveCode Open Source Team

LiveCode 2016 Conference https://livecode.com/edinburgh-2016/




More information about the Use-livecode mailing list