Вы можете немного упростить это, расширив свои массивы функцией count
.Он работает аналогично Ruby's Array#count
, если вы с ним знакомы.
Array.prototype.count = function(obj){
var count = this.length;
if(typeof(obj) !== "undefined"){
var array = this.slice(0), count = 0; // clone array and reset count
for(i = 0; i < array.length; i++){
if(array[i] == obj){ count++ }
}
}
return count;
}
Использование:
let array = ['a', 'b', 'd', 'a', 'c'];
array.count('a'); // => 2
array.count('b'); // => 1
array.count('e'); // => 0
array.count(); // => 5
Суть
Редактировать
Затем вы можете получить свой первый массив с каждым возникшим элементом, используя Array#filter
:
let occurred = [];
array.filter(function(item) {
if (!occurred.includes(item)) {
occurred.push(item);
return true;
}
}); // => ["a", "b", "d", "c"]
И свой второй массив счисло вхождений, используя Array#count
в Array#map
:
occurred.map(array.count.bind(array)); // => [2, 1, 1, 1]
В качестве альтернативы, если порядок не имеет значения, вы можете просто вернуть его как пару ключ-значение:
let occurrences = {}
occurred.forEach(function(item) { occurrences[item] = array.count(item) });
occurences; // => {2: 5, 4: 1, 5: 3, 9: 1}