Tengo esta matriz:
const demo = [ { key: 'apple', a: 'b', c: 1 }, { key: 'banana', a: 'f', c: 3 }, { key: 'orange', a: 'j', c: 8 }, ];Puedo obtener información sobre "banana" usando:
demo.find(item => item.key === 'banana')En cambio, me gustaría tener este asociativo y acceder así:
demo.banana.cAsí que necesito de alguna manera obtener esto:
const demo = { 'apple': { key: 'apple', a: 'b', c: 1 }, 'banana': { key: 'banana', a: 'f', c: 3 }, 'orange': { key: 'orange', a: 'j', c: 8 }, };O sin "llave" adentro, no importa.
¿Cuál sería la solución más simple? ¿Algún enfoque simple (tal vez de una sola línea) con ES6? Si no, ¿Lodash en su lugar?
const demo = [{ key: 'apple', a: 'b', c: 1 }, { key: 'banana', a: 'f', c: 3 }, { key: 'orange', a: 'j', c: 8 }, ]; const solution = demo.reduce((acc, cur) => { acc[cur.key] = cur; return acc }, {}) console.log(solution)Podría usar Object.fromEntries para construir el objeto y desestructurar para extraer la clave del resto del objeto original:
const demo = [ { key: 'apple', a: 'b', c: 1 }, { key: 'banana', a: 'f', c: 3 }, { key: 'orange', a: 'j', c: 8 }, ]; let result = Object.fromEntries(demo.map(({key, ...rest}) => [key, rest])); console.log(result);Usas _.keyBy() de lodash:
const demo = [ { key: 'apple', a: 'b', c: 1 }, { key: 'banana', a: 'f', c: 3 }, { key: 'orange', a: 'j', c: 8 }, ]; const result = _.keyBy(demo, 'key'); console.log(result); <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>