Другим элегантным решением будет использование Array.prototype.reduce .
Дано:
var arr = new Array("apple","banana","apple","orange","banana","apple");
Вы можете просто запустить уменьшить на нем:
var groups =
arr.reduce(function(acc,e){acc[e] = (e in acc ? acc[e]+1 : 1); return acc}, {});
Наконец, вы можете проверить результат:
groups['apple'];
groups['banana'];
В приведенном выше примере уменьшить принимает два параметра:
- функция (здесь анонимная), берущая аккумулятор (инициализированный из второго аргумента метода Reduce) и текущий элемент массива
- начальное значение аккумулятора
Что бы функция не возвращала, она будет использоваться в качестве значения аккумулятора при следующем вызове.
С точки зрения типа, независимо от типа элементов массива, тип аккумулятора должен совпадать с типом второго аргумента redu (начальное значение) и типом возвращаемого значения анонимной функции.
Это также будет тип возвращаемого значения уменьшить .