Skip to content

Instantly share code, notes, and snippets.

@sagarpanchal
Created May 11, 2023 17:06
Show Gist options
  • Save sagarpanchal/b75c101fbe430e3901aaa222333714fa to your computer and use it in GitHub Desktop.
Save sagarpanchal/b75c101fbe430e3901aaa222333714fa to your computer and use it in GitHub Desktop.
export function mapListByProp<T extends object, K extends keyof T>(list: T[], key: K) {
const output = new Map<T[K], T[]>()
for (const item of list) {
if (!(key in item)) continue
const existingList = (output.has(item[key]) && output.get(item[key])) || []
const updatedList = [...existingList, item]
output.set(item[key], updatedList)
}
return output
}
export function mapToObject<K extends PropertyKey, V>(map: Map<K, V>) {
const mapKeys = map.keys()
const output = {} as Record<K, V>
for (const key of mapKeys) {
output[key] = map.get(key) as V
}
return output
}
@sagarpanchal
Copy link
Author

How to use:

const list = [
  { VIN: "5YJ3E1EB4L", ModelYear: 2020, Make: "TESLA", Model: "MODEL 3" },
  { VIN: "5YJ3E1EB5J", ModelYear: 2021, Make: "TESLA", Model: "MODEL 3" },
  { VIN: "7JRBROFL9M", ModelYear: 2021, Make: "VOLVO", Model: "560" },
  { VIN: "7JRBROFL9N", ModelYear: 2022, Make: "VOLVO", Model: "560" },
  { VIN: "JTJHKNMCF7", ModelYear: 2022, Make: "LEXUS", Model: "ES 300h" },
]

const mappedByVIN = mapListByProp(list, "VIN")
const mappedByYear = mapListByProp(list, "ModelYear")
const mappedByMake = mapListByProp(list, "Make")
// const mappedByModel = mapListByProp(list, "Model")

mappedByVIN.get("5YJ3E1EB4L")
// [{ VIN: "5YJ3E1EB4L", ModelYear: 2020, Make: "TESLA", Model: "MODEL 3" }]

mappedByYear.get(2022)
// [
//   { VIN: "7JRBROFL9N", ModelYear: 2022, Make: "VOLVO", Model: "560" },
//   { VIN: "JTJHKNMCF7", ModelYear: 2022, Make: "LEXUS", Model: "ES 300h" },
// ]

mappedByMake.get("TESLA")?.find((tesla) => tesla.ModelYear === 2020)
// { VIN: "5YJ3E1EB4L", ModelYear: 2020, Make: "TESLA", Model: "MODEL 3" }

mapToObject(mappedByVIN)
// {
//   "5YJ3E1EB4L": [{ VIN: "5YJ3E1EB4L", ModelYear: 2020, Make: "TESLA", Model: "MODEL 3" }],
//   "5YJ3E1EB5J": [{ VIN: "5YJ3E1EB5J", ModelYear: 2021, Make: "TESLA", Model: "MODEL 3" }],
//   "7JRBROFL9M": [{ VIN: "7JRBROFL9M", ModelYear: 2021, Make: "VOLVO", Model: "560" }],
//   "7JRBROFL9N": [{ VIN: "7JRBROFL9N", ModelYear: 2022, Make: "VOLVO", Model: "560" }],
//   "JTJHKNMCF7": [{ VIN: "JTJHKNMCF7", ModelYear: 2022, Make: "LEXUS", Model: "ES 300h" }],
// }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment