È una cattiva pratica usare le stringhe JSON come chiavi degli oggetti?

2

Su linguaggi come Haskell , la maggior parte dei tipi di dati hanno istanze che consentono di utilizzare i loro valori come chiavi di strutture come Maps . JavaScript ha mappe ragionevolmente veloci, chiamate oggetti, ma accettano solo chiavi di stringa. C'è qualche problema concettuale, o qualsiasi altra cosa di cui preoccuparsi, nell'uso di stringhe JSON come chiavi di oggetti per emulare ciò che Haskell fa? Cioè.,

var point = {"x": 7, "y": 8, "z": 9};
var pointColor = {};
pointColor[JSON.stringify(point)] = "blue";
    
posta MaiaVictor 19.04.2016 - 17:43
fonte

2 risposte

6

On languages such as Haskell, most datatypes have instances which allow their values to be used as keys of structures such as Maps.

È lo stesso in ECMAScript. Qualsiasi oggetto, incluse le primitive, può essere utilizzato come chiave in un Map . Anche NaN , anche se NaN !== NaN // true fa la cosa giusta e può essere ragionevolmente utilizzato come chiave in Map .

JavaScript has reasonably fast maps, there called objects, but those only accept string keys.

Accettano anche le Symbol chiavi.

Inoltre, ECMAScript ha anche un tipo di dati Map nativo.

Is there any conceptual issue, or anything else to be worried of, in using JSON strings as keys of objects in order to emulate what Haskell does?

Diversi oggetti possono avere la stessa rappresentazione JSON e lo stesso oggetto può avere più rappresentazioni JSON.

La soluzione più semplice sarebbe utilizzare il tipo di dati standard Map :

const point = {x: 7, y: 8, z: 9};
const pointColor = new Map();
pointColor.set(point, "blue");

for (let [{x, y, z}, color] of pointColor) console.log('{x: ${x}, y: ${y}, z: ${z}} = ${color}');
// {x: 7, y: 8, z: 9} = blue
    
risposta data 19.04.2016 - 18:38
fonte
3

Ciò che vuoi veramente è una mappa, non un oggetto: Mappa

Devi controllare se il supporto di cui hai bisogno per adattarsi ai browser supportati da Map, ma è quello che vuoi veramente quando gli oggetti prendono solo stringhe o simboli come chiavi mentre una mappa può prendere qualsiasi cosa

Ecco un esempio del suo utilizzo:

  var point1 = {"x": 7, "y": 8, "z": 9};
  var point2 = {"x": 6, "y": 5, "z": 4};

  var pointColor = new Map();
  pointColor.set(point1,'blue');
  pointColor.set(point2,'red');
  console.log(pointColor, pointColor.get(point1))
    
risposta data 19.04.2016 - 18:37
fonte

Leggi altre domande sui tag