tutorial soljson smart remix org optimize online false español curso 59dbf8f1 javascript

javascript - soljson - ¿Cómo crear un objeto a partir de una matriz de pares clave-valor?



smart contracts ethereum (5)

En ES6 podrías definir esa función de dict como esta:

const dict = arr => Object.assign(...arr.map( ([k, v]) => ({[k]: v}) )); // Demo: const obj = dict([[''name'', ''Bob''], [''age'', 42], [''breakfast'', ''eggs'']]); console.log(obj);

En lugar de llamarlo dict , puedes definirlo en Object y llamarlo from :

Object.from = arr => Object.assign(...arr.map( ([k, v]) => ({[k]: v}) ));

Algo bueno es que este método hace lo contrario de Object.entries (ES2017), por lo que ahora puede ir y venir entre el objeto y la representación de matriz:

Object.from = arr => Object.assign(...arr.map( ([k, v]) => ({[k]: v}) )); // Demo: const arr = [[''name'', ''Bob''], [''age'', 42], [''breakfast'', ''eggs'']]; const arr2 = Object.entries(Object.from(arr)); console.log(arr2); // copy of the original array (omitting duplicate keys)

.as-console-wrapper { max-height: 100% !important; top: 0; }

Mapa ES6

Existe una alternativa a los objetos simples para los pares clave / valor: Map .

Su constructor acepta el formato de matriz de pares:

// Demo: const arr = [[''name'', ''Bob''], [''age'', 42], [''breakfast'', ''eggs'']]; const mp = new Map(arr); // Get one particular value: console.log(mp.get(''age'')); // Get all the keys: console.log(...mp.keys()); // Get all the values: console.log(...mp.values()); // Get all the key/value pairs: console.log(...mp.entries());

Si realmente necesita un objeto plano, esto no es útil, pero un Mapa puede presentar una alternativa viable.

En Python, uno puede pasarle al constructor de dict 1 una secuencia de pares clave-valor:

>>> dict([[''name'', ''Bob''], [''age'', 42], [''breakfast'', ''eggs'']]) {''age'': 42, ''name'': ''Bob'', ''breakfast'': ''eggs''}

No puedo pensar en otra forma de hacer este tipo de cosas en JavaScript que no sea definir mi propia función con el propósito:

function pairs_to_object(pairs) { var ret = {}; pairs.forEach(function (p) { ret[p[0]] = p[1]; }); return ret; }

Pero soy un noob de JS ... ¿Hay algo integrado para esta conversión de pares a objeto?

1 A los efectos de esta pregunta, estoy tratando los dicts de Python como contrapartes de los objetos JS de Python, aunque, por supuesto, la similitud se limita solo al hecho de que ambos son colecciones de valor-clave.


Javascript no tiene una función nativa para convertir una matriz en un objeto de la manera que ha descrito. Pero, esto es porque no hay necesidad de ello. Ya ha incluido en la pregunta una solución de ejemplo, donde define la función usted mismo, pero eso realmente no es necesario. Siempre que pueda estar seguro de que la matriz de entrada es correcta, incluso podría hacer la conversión con un simple bucle for, de este modo:

var input = [[''name'', ''Bob''], [''age'', 42], [''breakfast'', ''eggs'']]; var output = {}; for(i in input) output[input[i][0]] = input[i][1];

Que es casi el código más básico imaginable.

Por supuesto, (como lo señala mamapitufo) generalmente es una mala idea usar for..in para iterar sobre una matriz, porque eso también devolverá valores no-indexados de i. Aún así, el punto es que este tipo de operación es demasiado simple, y rara vez se necesita, para justificar tener una función nativa.

El dict python es una estructura que no es necesaria en javascript, porque los dos lenguajes tienen diferentes enfoques para tipear y diseñar en general, por lo que lo útil para uno no es útil para otro. Si bien podrías trabajar en el uso de los mismos métodos y estructuras que utilizaste en python, podría ser una mejor idea pensar cómo aprovechar la diferente forma de hacer las cosas de JavaScript. Tal vez descubras que no necesitas un dict. después de todo.


La función fromPairs de fromPairs hará esto:

const _ = require(''lodash'') const kvPairs = [[''a'', 1], [''b'', 2]] _.fromPairs(kvPairs) // => { a: 1, b: 2 }


Los objetos JavaScript / diccionarios / matrices asociativas no tienen dicho constructor de forma nativa.

Como dijo usted mismo, puede, por supuesto, construir su propia función utilizando, por ejemplo, un enfoque funcional utilizando la función reduce como se explica en una de las otras respuestas. Un clásico para o más nuevo para cada ciclo también funcionaría, por supuesto. Pero no hay nada incorporado.


Puedes usar la función reducir

x = [[1,2],[3,4],[5,6]]; o = x.reduce(function(prev,curr){prev[curr[0]]=curr[1];return prev;},{})

o ahora es el equivalente de {1:2, 3:4, 5:6}

Si la matriz de entrada es dispersa, querrá agregar una prueba if(curr!=undefined) en la asignación, pero asegúrese de que todavía devuelva "prev".

Si sus tuplas son algo más complejas que la simple [clave, valor], simplemente puede cambiar la forma en que se asigna "prev". Ej .: prev["key-"+curr[0].toString()]=curr[1]*2;