I am trying to extract multiple flat arrays of values from an object array.
I'm able to extract the values needed using ES6 Map, but I'd like to separate these values into individual arrays without having to loop multiple times.
Here is my attempt so far:
let list = [
{
"name": "namee 1",
"type": "type 1",
"deal_type": "dealtype1"
},
{
"name": "namee 2",
"type": "type 2",
"deal_type": "dealtype2"
},
{
"name": "namee 3",
"type": "type 3",
"deal_type": "dealtype3"
},
{
"name": "namee 1",
"type": "type 1",
"deal_type": "dealtype1"
}
]
const summary = test.map(item => ({ deal_type: item.deal_type, type: item.type}));
The desired outcome would be the following output from one .Map loop:
type = ["type 1", "type 2", "type 3"]
deal_type = ["dealtype1", "dealtype2", "dealtype3"]
You can achieve it with reduce
instead of map
using an array:
let list = [{"name": "namee 1","type": "type 1","deal_type": "dealtype1"},{"name": "namee 2","type": "type 2","deal_type": "dealtype2"},{"name": "namee 3","type": "type 3","deal_type": "dealtype3"},{"name": "namee 1","type": "type 1","deal_type": "dealtype1"}];
const [type, deal_type] = list.reduce((acc, el) => (
acc[0].push(el.type),
acc[1].push(el.deal_type),
acc
), [[], []]);
console.log(type);
console.log(deal_type);
or more verbose using an object
let list = [{"name": "namee 1","type": "type 1","deal_type": "dealtype1"},{"name": "namee 2","type": "type 2","deal_type": "dealtype2"},{"name": "namee 3","type": "type 3","deal_type": "dealtype3"},{"name": "namee 1","type": "type 1","deal_type": "dealtype1"}];
const { type, deal_type } = list.reduce((acc, el) => (
acc.type.push(el.type),
acc.deal_type.push(el.deal_type),
acc
), { type: [], deal_type: [] });
console.log(type);
console.log(deal_type);
or if you want to remove duplicates:
let list = [{"name": "namee 1","type": "type 1","deal_type": "dealtype1"},{"name": "namee 2","type": "type 2","deal_type": "dealtype2"},{"name": "namee 3","type": "type 3","deal_type": "dealtype3"},{"name": "namee 1","type": "type 1","deal_type": "dealtype1"}];
const [type, deal_type] = list.reduce((acc, el) => (
acc[0].add(el.type),
acc[1].add(el.deal_type),
acc
), [new Set(), new Set()]).map(el => [...el]);
console.log(type);
console.log(deal_type);