Tengo debajo de la matriz de objetos. Como puede ver, tengo 2 runTypes llamados VEGGIES y FRUITS . Cada tipo de runType tendrá una lista de verticales. Por ejemplo, VEGGIES tiene SPINACH, TOMATO, ONION y FRUTAS tiene APPLE, BANANA, GRAPES
let data = [ { "runType": "VEGGIES", "verticals": [ { "vertical": "SPINACH", "radars": {} }, { "vertical": "TOMATO", "radars": {} }, { "vertical": "ONION", "radars": {} }, ], "total_count": {} }, { "runType": "FRUITS", "verticals": [ { "vertical": "APPLE", "radars": { } }, { "vertical": "BANANA", "radars": {} }, { "vertical": "GRAPES", "radars": { "P5": 8 } } ], "total_count": { "P5": 8 } } ] En mi caso, quiero extraer estos valores vertical y ponerlos en una matriz. En el caso de una matriz regular de objetos, podemos lograr la tarea anterior usando este código.
let result = data.map(({ verticals }) => vertical)Pero mi código tiene una matriz de objetos dentro de una matriz de objetos. ¿Puede alguien decirme cómo lograr estos 3 escenarios?
¿Alguien puede arrojar algo de luz sobre estos datos en particular?
Además del map el OP también podría echar un vistazo a flatMap y find ... reduce también vale la pena intentarlo ...
let data = [{ "runType": "VEGGIES", "verticals": [{ "vertical": "SPINACH", "radars": {}, }, { "vertical": "TOMATO", "radars": {}, }, { "vertical": "ONION", "radars": {}, }], "total_count": {}, }, { "runType": "FRUITS", "verticals": [{ "vertical": "APPLE", "radars": {}, }, { "vertical": "BANANA", "radars": {}, }, { "vertical": "GRAPES", "radars": { "P5": 8, }, }], "total_count": { "P5": 8, }, }]; // Scenario 1 // - Get all the verticals for both runType. // - Result should be [SPINACH, TOMATO, ONION, APPLE, BANANA, GRAPES] console.log('Scenario 1 ... ', data .flatMap(({ verticals }) => verticals.map(({ vertical }) => vertical) ) ); // Scenario 2 // - get all verticals for runType = 'VEGGIES'. // - Result should be [SPINACH, TOMATO, ONION] console.log('Scenario 2 ... ', data .find(item => item.runType === 'VEGGIES') .verticals.map(({ vertical }) => vertical) ); // Scenario 3 // - get all verticals for runType = 'FRUITS'. // - Result should be [APPLE, BANANA, GRAPES] console.log('Scenario 3 ... ', data .find(item => item.runType === 'FRUITS') .verticals.map(({ vertical }) => vertical) ); // Bonus // - based on Array#reduce one can achieve everything at once function groupMergeAndCollectVerticals(collector, item) { const { index, list } = collector; const { runType, verticals } = item; const group = (index[runType] ??= []); const verticalList = verticals.map(({ vertical }) => vertical); group.push(...verticalList); list.push(...verticalList); return collector; } const verticalsCollection = data.reduce(groupMergeAndCollectVerticals, { index: {}, list: [] }); console.log( 'reduce based :: all at once ... ', verticalsCollection ); console.log( 'reduce based :: Scenario 1 ... ', verticalsCollection.list ); console.log( 'reduce based :: Scenario 2 ... ', verticalsCollection.index['VEGGIES'] ); console.log( 'reduce based :: Scenario 3 ... ', verticalsCollection.index['FRUITS'] ); .as-console-wrapper { min-height: 100%!important; top: 0; }Prueba esto:
let data = [{ "runType": "VEGGIES", "verticals": [{ "vertical": "SPINACH", "radars": {} }, { "vertical": "TOMATO", "radars": {} }, { "vertical": "ONION", "radars": {} }, ], "total_count": {} }, { "runType": "FRUITS", "verticals": [{ "vertical": "APPLE", "radars": { } }, { "vertical": "BANANA", "radars": {} }, { "vertical": "GRAPES", "radars": { "P5": 8 } } ], "total_count": { "P5": 8 } } ] var findData = (runType) => data.filter(x => x.runType == runType).map(x => x.verticals)[0].map(i => i.vertical) console.log("VEGGIES:", findData("VEGGIES")) console.log("FRUITS:", findData("FRUITS")) console.log("COMBINED:", findData("VEGGIES").concat(findData("FRUITS")))