Pregunta

En otros lenguajes como Python 2 y Python 3, puede definir y asignar valores a una variable tupla, y recuperar sus valores como esto:

tuple = ("Bob", 24)
name, age = tuple
print(name)           #name evaluates to Bob
print(age)            #age evaluates to 24

¿Hay algo similar en JavaScript? O es que sólo hay que hacerlo de la manera fea con una matriz:

tuple = ["Bob", 24]
name = tuple[0]       //name Evaluates to Bob
age = tuple[1]        //age Evaluates to 24

¿Hay una mejor manera de simular tuplas Python en JavaScript 5?

¿Fue útil?

Solución

Hay que hacerlo de la manera fea. Si realmente quiere algo como esto, se puede extraer CoffeeScript , que tiene que y una porción entera de otras características que hacen que parezca más como pitón (lo siento por hacer que suene como un anuncio, pero me gusta mucho.)

Otros consejos

asignación desestructurada que permite hacer esencialmente lo que está después.

function getTuple(){
   return ["Bob", 24];
}
var [a, b] = getTuple();
// a === "bob" , b === 24 are both true

Se puede hacer algo similar:

var tuple = Object.freeze({ name:'Bob', age:14 })

y luego referirse a nombre y edad como atributos

tuple.name 
tuple.age 

Esta característica "tupla" se llama desestructuración en EcmaScript2015 y está pronto a ser soportado por los navegadores hasta la fecha. Por el momento, única Firefox y Chrome soportan .

Pero bueno, se puede utilizar un transpiler .

El código sería tan agradable como Python:

let tuple = ["Bob", 24]
let [name, age] = tuple

console.log(name)
console.log(age)

Un congelados se comporta de matriz idéntica a una tupla Python:

const tuple = Object.freeze(["Bob", 24]);
let [name, age]; = tuple
console.debug(name); // "Bob"
console.debug(age); // 24

ser de lujo y definir una clase

class Tuple extends Array { 
  constructor(...items) { 
    super(...items); 
    Object.freeze(this);
  } 
}

let tuple = new Tuple("Jim", 35);
let [name, age] = tuple;
console.debug(name); // Jim
console.debug(age); // 35
tuple = ["Bob", 24]; // no effect 
console.debug(name); // Jim
console.debug(age); // 25

funciona en la actualidad en todos los navegadores más recientes.

Por desgracia no se puede utilizar la sintaxis asignación de tuplas en (ECMA | Java). Guión

EDIT:. Alguien relacionado con Mozilla / 1.7 JS - esto no funcionaría a través del navegador, pero si eso no se requiere entonces no tienes la respuesta

Las tuplas no están soportadas en JavaScript

Si usted está buscando una lista inmutable, Object.freeze () se puede utilizar para hacer una inmutable matriz.

El Object.freeze () método congela un objeto: es decir, impide que las nuevas propiedades de ser añadido a la misma; previene inmuebles de ser eliminado existentes; y previene las propiedades existentes, o su enumerability, configurabilidad, o capacidad de escritura, de ser cambiado. En esencia, el objeto se hace efectiva inmutable. Los devuelve el método del objeto de ser congelado.

Fuente: Mozilla Developer Network - Object.freeze ()

Asignar una matriz como de costumbre, pero bloquearlo usando 'Object.freeze ()

> tuple = Object.freeze(['Bob', 24]);
[ 'Bob', 24 ]

Usar los valores como lo haría una matriz regular (pitón multi-tarea no es compatible)

> name = tuple[0]
'Bob'
> age = tuple[1]
24

Intento de asignar un nuevo valor

> tuple[0] = 'Steve'
'Steve'

Pero el valor no se cambia

> console.log(tuple)
[ 'Bob', 24 ]

Esto no está destinado a ser utilizado realmente en la vida real, sólo un ejercicio interesante. Ver ¿Por qué se utiliza la función eval Javascript una mala idea? para más detalles.

Esto es lo más cercano que puede obtener sin tener que recurrir a las extensiones de proveedores específicos:

myArray = [1,2,3];
eval(set('a,b,c = myArray'));

Función de ayuda:

function set(code) {
    var vars=code.split('=')[0].trim().split(',');
    var array=code.split('=')[1].trim();
    return 'var '+vars.map(function(x,i){return x+'='+array+'['+i+']'}).join(',');
}

La prueba de que funciona en el ámbito de aplicación arbitraria:

(function(){
    myArray = [4,5,6];
    eval(set('x,y,z = myArray'));
    console.log(y);  // prints 5
})()

eval no se admite en Safari.

Como una actualización de la respuesta de la ministra, ahora se puede hacer esto con ES2015:

function Tuple(...args) {
  args.forEach((val, idx) => 
    Object.defineProperty(this, "item"+idx, { get: () => val })
  )
}


var t = new Tuple("a", 123)
console.log(t.item0) // "a"
t.item0 = "b"
console.log(t.item0) // "a"

https://jsbin.com/fubaluwimo/edit?js,console

Puede tener un tipo tupla en Javascript también. Justo lo definen con funciones de orden superior (el término académico es Iglesia de codificación):

const Tuple = (...args) => {
  const Tuple = f => f(...args);
  return Object.freeze(Object.assign(Tuple, args));
};

const get1 = tx => tx((x, y) => x);

const get2 = tx => tx((x, y) => y);

const bimap = f => g => tx => tx((x, y) => Tuple(f(x), g(y)));

const toArray = tx => tx((...args) => args);

// aux functions

const inc = x => x + 1;
const toUpperCase = x => x.toUpperCase();

// mock data

const pair = Tuple(1, "a");

// application

console.assert(get1(pair) === 1);
console.assert(get2(pair) === "a");

const {0:x, 1:y} = pair;
console.log(x, y); // 1 a

console.log(toArray(bimap(inc) (toUpperCase) (pair))); // [2, "A"]

const map = new Map([Tuple(1, "a"), Tuple(2, "b")]);
console.log(map.get(1), map.get(2)); // a b

Tenga en cuenta que Tuple no se utiliza como un constructor normal. La solución no se basa en el sistema prototipo en absoluto, sino únicamente en funciones de orden superior.

¿Cuáles son las ventajas de tuplas más Arrays utilizados como tuplas? Iglesia codificado tuplas son inmutables por diseño y por lo tanto prevenir los efectos secundarios causados ??por mutaciones. Esto ayuda a construir aplicaciones más robustas. Además, es más fácil a la razón sobre el código que distingue entre Arrays como un tipo de colección (por ejemplo [a]) y tuplas como datos relacionados de diversos tipos (por ejemplo (a, b)).

Esta es una sencilla aplicación Javascript Tupla:

var Tuple = (function () {
   function Tuple(Item1, Item2) {
      var item1 = Item1;
      var item2 = Item2;
      Object.defineProperty(this, "Item1", {
          get: function() { return item1  }
      });
      Object.defineProperty(this, "Item2", {
          get: function() { return item2  }
      });
   }
   return Tuple;
})();

var tuple = new Tuple("Bob", 25); // Instantiation of a new Tuple
var name = tuple.Item1; // Assignment. name will be "Bob"
tuple.Item1 = "Kirk"; // Will not set it. It's immutable.

Esta es una 2-tupla, sin embargo, podría modificar mi ejemplo para apoyar 3,4,5,6 etc. tuplas.

[a, b, c] = [2, 'momo', 7]  // b === 'momo', c ===7 ...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top