Las asignaciones de variables de JavaScript de tuplas
-
12-10-2019 - |
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?
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
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 ??p>
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"
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 Array
s 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 Array
s 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 ...