0

Goal: to return an array listing the unique values for one specific key within an object.

const people = [
    {id: 1, name: 'Barb', gender: 'female'},
    {id: 2, name: 'Carl', gender: 'male'},
    {id: 3, name: 'John', gender: 'male'},
    {id: 4, name: 'Jane', gender: 'female'},
    {id: 5, name: 'Pete', gender: 'male'},
    {id: 6, name: 'Annie', gender: 'female'},
    {id: 7, name: 'Katie', gender: 'female'},
    {id: 8, name: 'Sally', gender: 'female'},
    {id: 9, name: 'Steve', gender: 'male'},
]

Desired output:

['male','female']
terrymorse
  • 6,771
  • 1
  • 21
  • 27
cssyphus
  • 37,875
  • 18
  • 96
  • 111

2 Answers2

1

You could use Set Object to return an array listing the unique values for one specific key within an object.

  • Create new Set.
  • Traverse the array using forEach() method.
  • Check the specified property and add the value to the Set
  • At last, return the unique values array.

const people = [
  { id: 1, name: 'Barb', gender: 'female' },
  { id: 2, name: 'Carl', gender: 'male' },
  { id: 3, name: 'John', gender: 'male' },
  { id: 4, name: 'Jane', gender: 'female' },
  { id: 5, name: 'Pete', gender: 'male' },
  { id: 6, name: 'Annie', gender: 'female' },
  { id: 7, name: 'Katie', gender: 'female' },
  { id: 8, name: 'Sally', gender: 'female' },
  { id: 9, name: 'Steve', gender: 'male' },
];
const unique = (key, array) => {
  const set = new Set();
  array.forEach(
    (x) => Object.prototype.hasOwnProperty.call(x, key) && set.add(x[key])
  );
  return [...set];
};

console.log(unique('gender', people));
mr hr
  • 3,162
  • 2
  • 9
  • 19
0

The category key can be reduced to unique values using reduce() and Set, like this:

Returns: ['female', 'male']

const people = [
    {id: 1, name: 'Barb', gender: 'female'},
    {id: 2, name: 'Carl', gender: 'male'},
    {id: 3, name: 'John', gender: 'male'},
    {id: 4, name: 'Jane', gender: 'female'},
    {id: 5, name: 'Pete', gender: 'male'},
    {id: 6, name: 'Annie', gender: 'female'},
    {id: 7, name: 'Katie', gender: 'female'},
    {id: 8, name: 'Sally', gender: 'female'},
    {id: 9, name: 'Steve', gender: 'male'},
]

const genders = people.reduce((aSex, currItem) => {
   aSex.push(currItem.gender);
   return aSex
}, [])

let unique = [...new Set(genders)];

console.log(unique)

Similarly, the number of instances of each unique value within the key "category" can be returned like this:

Returns: {"female": 3, "male": 4}

const people = [
    {id: 1, name: 'Barb', gender: 'female'},
    {id: 2, name: 'Carl', gender: 'male'},
    {id: 3, name: 'John', gender: 'male'},
    {id: 4, name: 'Jane', gender: 'female'},
    {id: 5, name: 'Pete', gender: 'male'},
    {id: 6, name: 'Annie', gender: 'female'},
    {id: 7, name: 'Katie', gender: 'female'},
    {id: 8, name: 'Sally', gender: 'female'},
    {id: 9, name: 'Steve', gender: 'male'},
]

const genderCount = people.reduce((oSex, currItem) => {
   oSex[currItem.gender] = (oSex[currItem.gender] || 0) + 1
   return oSex
}, {})

console.log(genderCount)

References:

Nina Scholz' one-line solution to the first example

https://www.freecodecamp.org/news/reduce-f47a7da511a9/#creating-a-tally-with-the-reduce-method-in-javascript-

https://wsvincent.com/javascript-remove-duplicates-array/

halfer
  • 19,824
  • 17
  • 99
  • 186
cssyphus
  • 37,875
  • 18
  • 96
  • 111
  • why not use a set as accumulator in the first case? – Nina Scholz Dec 21 '20 at 18:20
  • Why not simply `const uniqueGenders = [...new Set(people.map(({gender}) => gender))]` for the first scenario? – Yevhen Horbunkov Dec 21 '20 at 18:22
  • @NinaScholz Since you asked that question I've been trying to work out how to do that.... What would that syntax look like? *If it's easier from your perspective, please feel free to edit the answer.* – cssyphus Dec 21 '20 at 18:48
  • I guess, the point was to do something, like `const uniqeGenders = [...people.reduce((acc,{gender}) => acc.add(gender), new Set)]`, though `.map()`-based method (see my previous comment) is much more straightforward. – Yevhen Horbunkov Dec 21 '20 at 18:51
  • Thanks Yevgen - very kind of you to demonstrate. – cssyphus Dec 21 '20 at 18:54