What is the most professional way to obtain a case insensitive count of the distinct words contained in an array using plain javascript? I have done the first attempt myself but does not feel much professional.
I would like the result to be a Map
CodePudding user response:
You can use Array.reduce
to store each word as a property and the occurrence of each as the value.
In the reducer function, check whether the letter (converted to lowercase) exists as a property. If not, set its value to 1
. Otherwise, increment the property value.
const arr = ["a", "A", "b", "B"]
const result = arr.reduce((a,b) => {
let c = b.toLowerCase();
return a[c] = a[c] ? a[c] : 1, a;
}, {})
console.log(result)
const result = arr.reduce((a,b) => (c = b.toLowerCase(), a[c] = a[c] ? a[c] : 1, a), {})
To convert it to a Map
, you can use Object.entries
(sugged by @Théophile):
const arr = ["a", "A", "b", "B"]
const result = arr.reduce((a, b) => {
let c = b.toLowerCase();
return a[c] = a[c] ? a[c] : 1, a;
}, {})
const m = new Map(Object.entries(result))
m.forEach((value, key) => console.log(key, ':', value))
CodePudding user response:
You can use an object to store the results and then create a Map
object by passing that object to Object.entries
const arr = ["c", "A", "C", "B", "b"];
const counts = {};
for (const el of arr) {
let c = el.toLowerCase();
counts[c] = counts[c] ? counts[c] : 1;
}
console.log(counts);
const map = new Map(Object.entries(counts))
map.forEach((k,v) => console.log(k,v))
CodePudding user response:
use set to get rid of duplicates and the spread operator to put it back in an array.
const myarray = ['one', 'One', 'two', 'TWO', 'three'];
const noDupes = [... new Set( myarray.map(x => x.toLowerCase()))];
console.log(noDupes);