linkedlist
linkedlist

Reputation: 91

Array reduce not giving all the data

let inputArr = [{
    "gender": "MALE",
    "name": "A",
    "age": 20
  },
  {
    "gender": "MALE",
    "name": "B",
    "age": 12
  },
  {
    "gender": "FEMALE",
    "name": "C",
    "age": 16
  },
  {
    "gender": "MALE",
    "name": "D",
    "age": 21
  },
  {
    "gender": "FEMALE",
    "name": "E",
    "age": 30
  }
]
console.log(JSON.stringify(inputArr.reduce((acc, ele) => {

  if (acc[ele["gender"]]) {
    acc[ele.gender].members.push(ele);
  } else {

    acc[ele["gender"]] = {
      members: []
    }
  }
  return acc;
}, {})))

I am trying to group users on the basis of gender ,using Array.reduce but the output is not showing all the records that are included in the array ,I am not able to understand the isssue here

Upvotes: 1

Views: 70

Answers (2)

Saro Amirkhanyan
Saro Amirkhanyan

Reputation: 49

Another solution, but I don't recommend this if performance matter.

let inputArr = [{
    "gender": "MALE",
    "name": "A",
    "age": 20
  },
  {
    "gender": "MALE",
    "name": "B",
    "age": 12
  },
  {
    "gender": "FEMALE",
    "name": "C",
    "age": 16
  },
  {
    "gender": "MALE",
    "name": "D",
    "age": 21
  },
  {
    "gender": "FEMALE",
    "name": "E",
    "age": 30
  }
]

function groupBy(array, field) {
  return array.reduce((acc, item) => ({
    ...acc,
    [item[field]]: [...acc[item[field]] || [], item]
  }), {})
}

console.log(groupBy(inputArr, "gender"))

Upvotes: 0

jonatjano
jonatjano

Reputation: 3738

Your reducer doesn't push the element when it encounter a gender for the first time, so the first user of each gender is missing from your result

let inputArr = [{"gender": "MALE","name": "A","age": 20},{"gender": "MALE","name": "B","age": 12},{"gender": "FEMALE","name": "C","age": 16},{"gender": "MALE","name": "D","age": 21},{"gender": "FEMALE","name": "E","age": 30}]

console.log(JSON.stringify(inputArr.reduce((acc, ele) => {

  if (acc[ele["gender"]]) {
    acc[ele.gender].members.push(ele);
  } else {

    acc[ele["gender"]] = {
      members: [ele] // initialise the array with the current user
    }
  }
  return acc;
}, {})))

Upvotes: 1

Related Questions