tengo una matriz:
const arr = [ { countries : {countryCode :"US", value: true}, vendors: [{vendorName: 'TES', value: true}, {vendorName: 'HPEFS', value: true}] }, { countries : {countryCode :"CA", value: true}, vendors: [{vendorName: 'TES', value: true}, {vendorName: 'HPEFS', value: false}] } ]; expected result: [{vendor: "TES", countries: [US, CA]}, {vendor: "HPEFS", countries: [US]}]
Se agradece cualquier idea, gracias de antemano
Puede lograr fácilmente el resultado usando Map
y forEach
const arr = [ { countries: { countryCode: "US", value: true }, vendors: [ { vendorName: "TES", value: true }, { vendorName: "HPEFS", value: true }, ], }, { countries: { countryCode: "CA", value: true }, vendors: [ { vendorName: "TES", value: true }, { vendorName: "HPEFS", value: false }, ], }, ]; const map = new Map(); arr.forEach(({ countries, vendors }) => { const { countryCode, value } = countries; vendors.forEach((o) => { if (o.value) { !map.has(o.vendorName) ? map.set(o.vendorName, [countryCode]) : map.get(o.vendorName).push(countryCode); } }); }); const result = []; for (let [vendor, countries] of map) result.push({ vendor, countries }); console.log(result);
/* This is not a part of answer. It is just to give the output full height. So IGNORE IT */ .as-console-wrapper { max-height: 100% !important; top: 0; }
Aquí está la solución:
const arr = [ { countries: { countryCode: "US", value: true }, vendors: [{ vendorName: 'TES', value: true }, { vendorName: 'HPEFS', value: true }] }, { countries: { countryCode: "CA", value: true }, vendors: [{ vendorName: 'TES', value: true }, { vendorName: 'HPEFS', value: false }] } ]; // expected result: [{vendor: "TES", countries: [US, CA]}, {vendor: "HPEFS", countries: [US]}] const loookup = arr.reduce((acc, curr) => { curr.vendors.forEach(item => { if (item.value) { if (acc[item.vendorName] && !acc[item.vendorName].includes(curr.countries)) { acc[item.vendorName] = [...acc[item.vendorName], curr.countries.countryCode] } else { acc[item.vendorName] = [curr.countries.countryCode] } } }) return acc; }, {}); const result = Object.keys(loookup).map(key => { return { vendor: key, countries: loookup[key] } }) console.log(result)
/* This is not a part of answer. It is just to give the output full height. So IGNORE IT */ .as-console-wrapper { max-height: 100% !important; top: 0; }