In this instance, doing key, value in pairs(dictionary) is the same as key, value in dictionary, while ipairs would not loop over it at all since it’s not an array-like table.
I’m not entirely sure about the underlying implementations of pairs/ipairs but in case this is relevant, iterating over a table directly will call the underlying metamethod __iter if it does exist, while pairs and ipairs will not. You can see an example of this in a similar thread I talked about this in.
In Lua, arrays are implemented as tables with consecutive integer keys starting from 1. When you use the ipairs iterator, it specifically iterates over the numerical indices of the table in ascending order. This guarantees that the elements of the array will be traversed in the order they appear in the table.
Using ipairs to iterate over this loop will always go in the order Banana, Apple, Mango. However if you used pairs to iterate over this dictionary the right order is not guaranteed, which could output the order Mango, Banana, Apple.