You could combine your arrays to form key/value pairs for Object.fromEntries:
Object.fromEntries([['M', 'male'], ['F', 'female']]);
//=> {M: 'male', F: 'female'}
However Object.fromEntries does not handle collisions:
Object.fromEntries([['M', 'male'], ['F', 'female'], ['F', 'fa-female']]);
//=> {M: 'male', F: 'fa-female'}
As you can see, the previous value for F just got overridden :/
We can build a custom fromEntries function that puts values into arrays:
const fromEntries =
pairs =>
pairs.reduce((obj, [k, v]) => ({
...obj,
[k]: k in obj
? [].concat(obj[k], v)
: [v]
}), {});
fromEntries([['M', 'male'], ['M', 'fa-male'], ['F', 'female'], ['F', 'fa-female']]);
//=> {M: ["male", "fa-male"], F: ["female", "fa-female"]}
How do you create key/value pairs then?
One possible solution: zip
const zip = (x, y) => x.map((v, i) => [v, y[i]]);
zip(['F', 'M'], ['female', 'male']);
//=> [["F", "female"], ["M", "male"]]
So to produce all pairs (and your final object)
fromEntries([
...zip(['F', 'M'], ['female', 'male']),
...zip(['F', 'M'], ['fa-female', 'fa-male'])
]);