Say I have an array:
arr = [25, 25, 25, 20, 15, 10, 10, 5];
and I want to count up the number of duplicates (ie. three 25s and 2 10s) and make a new array that becomes:
newArr = ['25 * 3', 20, 15, '10 * 2', 5];
How should I go about doing this? Thanks!
Advertisement
Answer
You can use a Array#forEach
loop to iterate through each item of the array, keeping track of how many times each item has been seen before.
Demo:
JavaScript
x
16
16
1
let arr = [25, 25, 25, 20, 15, 10, 10, 5];
2
3
let result = [], seenBefore = [];
4
5
arr.forEach((item) => {
6
let seen = seenBefore.indexOf(item);
7
if (seen !== -1) return result[seen].count++;
8
result.push({ name: item, count: 1 });
9
seenBefore.push(item);
10
});
11
12
result = result.map(({ name, count }) =>
13
count > 1 ? `${name} * ${count}` : name
14
);
15
16
console.log(result);
The same technique but smaller using Array#reduce
:
JavaScript
1
13
13
1
let arr = [25, 25, 25, 20, 15, 10, 10, 5];
2
3
let result = arr
4
.reduce(
5
(acc, item) => {
6
acc[1].indexOf(item) !== -1 ? acc[0][acc[1].indexOf(item)].count++ : (acc[0].push({ name: item, count: 1 }), acc[1].push(item));
7
return acc;
8
},
9
[[], []]
10
)[0]
11
.map(({ name, count }) => (count > 1 ? `${name} * ${count}` : name));
12
13
console.log(result);