deleteAt: Difference between revisions

From Bohemia Interactive Community
Jump to navigation Jump to search
(format)
m (added comment)
Line 91: Line 91:
Deleting from an array with foreach and _foreachIndex variable is tricky. The array is being altered, the _foreachIndex won't keep up and other elements in the array will be skipped and in worst case not being deleted.
Deleting from an array with foreach and _foreachIndex variable is tricky. The array is being altered, the _foreachIndex won't keep up and other elements in the array will be skipped and in worst case not being deleted.
If you delete elements from an array in descending order (using while or for) it will work.
If you delete elements from an array in descending order (using while or for) it will work.
</dd>
</dl>
<!-- DISCONTINUE Notes -->
<!-- CONTINUE Notes -->
<dl class="command_description">
<dd class="notedate">Posted on February 9, 2017 - 22:45 (UTC)</dd>
<dt class="note">[[User:Igneous01|Igneous01]]</dt>
<dd class="note">
To expand on Highheads comment above - this is because forEach implements iterators to traverse a collection, which are read only by definition.
The variable _x is an iterator that points to the current item in the collection. Trying to alter _x will have no effect.
<code>ARRAY = [1,2,3,4,5,6,7,8];
{ _x = 2; } forEach ARRAY
// ARRAY is still [1,2,3,4,5,6,7,8]</code>
When trying to use deleteAt inside forEach, the behaviour would be undefined as you are invalidating the iterator reference, and it will not know how to traverse to the next element.
In short, only use forEach when reading data from an array.
For more info about iterators, see C++ Iterators.
</dd>
</dd>
</dl>
</dl>
<!-- DISCONTINUE Notes -->
<!-- DISCONTINUE Notes -->

Revision as of 02:57, 10 February 2017

Hover & click on the images for description

Description

Description:
Removes array element at the given index and returns removed element (modifies the original array, just like resize or set).
Groups:
Uncategorised

Syntax

Syntax:
array deleteAt index
Parameters:
array: Array
index: Number
Return Value:
Anything - returns the deleted element

Examples

Example 1:
_arr = [1,2,3]; _rem = _arr deleteAt 1; hint str [_rem, _arr]; //[2,[1,3]]

Additional Information

See also:
deleteRangesetresizeselectinfindtoArraytoStringforEachcountpushBackpushBackUniqueapplyappendsortparamparamsarrayIntersectsplitStringjoinString

Notes

Report bugs on the Feedback Tracker and/or discuss them on the Arma Discord or on the Forums.
Only post proven facts here! Add Note

Notes

Bottom Section

Posted on October 15, 2014 - 16:55 (UTC)
Heeeere's Johnny!
_array deleteAt 0is almost 60x faster than_array = _array - [_array select 0](Tested with an array of 10.000 strings, iterating through it using a for-from-to-do loop)
Posted on May 21, 2015 - 10:38 (UTC)
Killzone Kid
Array "shift" implementation using deleteAt, alternative to BIS_fnc_arrayShift KK_fnc_shift = { _this deleteAt 0 }; // Example arr = [1,2,3]; arr call KK_fnc_shift; //return of function is 1, arr now is [2,3]
Posted on May 21, 2015 - 10:44 (UTC)
Killzone Kid
Array "pop" implementation using deleteAt, alternative to BIS_fnc_arrayPop KK_fnc_pop = { _this deleteAt (count _this - 1) }; // Example arr = [1,2,3]; arr call KK_fnc_pop; //return of function is 3, arr now is [1,2]
Posted on March 4, 2016 - 15:58 (UTC)
Highhead
Deleting from an array with foreach and _foreachIndex variable is tricky. The array is being altered, the _foreachIndex won't keep up and other elements in the array will be skipped and in worst case not being deleted. If you delete elements from an array in descending order (using while or for) it will work.
Posted on February 9, 2017 - 22:45 (UTC)
Igneous01
To expand on Highheads comment above - this is because forEach implements iterators to traverse a collection, which are read only by definition. The variable _x is an iterator that points to the current item in the collection. Trying to alter _x will have no effect. ARRAY = [1,2,3,4,5,6,7,8]; { _x = 2; } forEach ARRAY // ARRAY is still [1,2,3,4,5,6,7,8] When trying to use deleteAt inside forEach, the behaviour would be undefined as you are invalidating the iterator reference, and it will not know how to traverse to the next element. In short, only use forEach when reading data from an array. For more info about iterators, see C++ Iterators.