In PHP there is a very useful function called array_count_values. It sorts an array by returning a 2 dimensional array consisting of non duplicate elements as keys, and values determined by how many times these elements appeared in the original array.
So, for example, an array [“red”,”green”,”blue”,”red”] would be converted into [“red” => 2, “green” =>1, “blue” => 1]. Duplicate elements are removed and the new array indicates how many times each, now unique value occurred in the array.
Unfortunately, Actionscript has no such function built in, so I made one. It is a modification of Senocular’s array.unique() prototype (which you can find in his Actionscript library), however rather than simply returning a unique array, it returns the 2 dimensional array mentioned above.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | Array.prototype.countValues = function () { var z, x = this.length, c = false, a = [], d = []; while (x--) { z = 0; while (z < x) { if (this[x] == this[z]) { c = true; d.push (this[x]); break; } z++; } if (!c) a.push ([this[x], 1]); else c = false; } y = a.length; while (y--) { q = 0; while (q < d.length) { if (a[y][0] == d[q]) a[y][1]++; q++; } } return a; }; |
Example useage:
var myArray:Array = new Array ("the", "cat", "sat", "on", "the", "mat"); var newArray:Array = myArray.countValues (); trace (newArray); // Returns [[mat,1],[on,1],[sat,1],[cat,1],[the,2]]
This prototype should work with arrays of objects, though it was designed for simple datatypes such as strings.
Note: This prototype is case sensitive for strings. If you want it to be case insensitive, just modify to, for example:
if (a[y][0].toLowerCase () == d[q].toLowerCase ()) a[y][1]++;
No Comments so far
Leave a Reply