Me gusta mucho esa función.Javascript equivalente a la lista de PHP()
$matches = array('12', 'watt');
list($value, $unit) = $matches;
¿Hay un equivalente de Javascript de eso?
Me gusta mucho esa función.Javascript equivalente a la lista de PHP()
$matches = array('12', 'watt');
list($value, $unit) = $matches;
¿Hay un equivalente de Javascript de eso?
Hay, pero en las "nuevas" versiones de Javascript: Destructuring assignment - Javascript 1.7. Probablemente solo sea compatible con los navegadores basados en Mozilla, y tal vez en Rhino.
var a = 1;
var b = 3;
[a, b] = [b, a];
EDITAR: en realidad, no me sorprendería si la biblioteca V8 Javascript (y por lo tanto Chrome) es compatible con esto. Pero no contar con ella, ya sea :)
Hay una implementación experimental de list()
por PHPJS aquí:
https://github.com/kvz/phpjs/blob/master/_experimental/array/list.js
El segundo enlace en esta publicación está muerto (* 404 - Esta no es la página web que está buscando *). – Pang
intente esto:
matches = ['12', 'watt'];
[value, unit] = matches;
Funciona en FF4 pero no en Chrome 12. De todos modos, genial! – Znarkus
CoffeeScript ofertas asignación desestructurada con la sintaxis:
[a, b] = someFunctionReturningAnArray()
Esto es más o menos idéntico a la característica ofrecida en las nuevas versiones de JavaScript. Sin embargo, CoffeeScript produce JS compilado que es compatible incluso con el motor JavaScript de IE6, y por lo tanto es una buena opción si la compatibilidad es vital.
Esta es mi solución para usar List/Explode en Javascript. Fiddle Working Example
En primer lugar la aplicación:
var dateMonth = "04/15";
dateMonth.split("/").list("month","day", "year");
month == "04";
day == "15";
year == null;
También permite la determinación del alcance de las nuevas variables generadas:
var scoped = (function()
{
var dateMonth = "07/24/2013";
dateMonth.split("/").list("month","day", "year", this);
this.month == "07";
this.day == "24";
this.year == "2013";
})();
Esto se logró mediante la modificación de un prototipo de la matriz.
Array.prototype.list = function()
{
var
limit = this.length,
orphans = arguments.length - limit,
scope = orphans > 0 && typeof(arguments[arguments.length-1]) != "string" ? arguments[arguments.length-1] : window
;
while(limit--) scope[arguments[limit]] = this[limit];
if(scope != window) orphans--;
if(orphans > 0)
{
orphans += this.length;
while(orphans-- > this.length) scope[arguments[orphans]] = null;
}
}
Me estoy quedando con mi solución. Si intenta algo como: matches = ['12', 'watt']; [valor, unidad] = coincidencias; O function() { var [año, mes] = $ (this) .val().división("/"); En Chrome, lanzará un error: "Error de referencia: lado izquierdo no válido en la asignación" –
Usar 'ventana' como objeto predeterminado es una muy mala idea. – Bergi
@Bergi solo lo usa de manera predeterminada. Puede proporcionar un objeto como último parámetro y lo usará. – micahblu
Este es mi truco; lo más corto que pude obtener sin escribir una función para hacerlo. Sin embargo, tenga cuidado con el alcance de "esto":
list = ["a","b","c"];
vals = [1,2,3];
for(var i in vals)this[list[i]]=vals[i];
console.log(a,b,c);
Lo suficientemente bueno para reír. Todavía asigno cada variable una a la vez:
a=vals[0];
b=vals[1];
c=vals[2];
Es mucho más corto de esta manera. Además, si tiene un conjunto de variables, probablemente deberían mantenerse en la matriz, o mejor aún deberían ser propiedades de un cierre, en lugar de declararlas todas por separado.
function list(fn,array){
if(fn.length && array.length){
for(var i=0;i<array.length;i++){
var applyArray = [];
for(var j=0;j<array[i].length;j++){
fn[j] = array[i][j];
applyArray.push(fn[j]);
}
fn.apply(this,applyArray);
}
}
}
Ejemplo:
//array array mixture for composure
var arrayMixture = [ ["coffee","sugar","milk"], ["tea","sugar","honey"] ];
//call our function
list(function(treat,addin,addin2){
console.log("I like "+treat+" with " + addin + " and " + addin2);
},arrayMixture);
//output:
//I like coffee with sugar and milk
//I like tea with sugar and honey
Como la mayoría de las implementaciones de JavaScript no son compatibles todavía esa característica, simplemente podría hacerlo de una forma más similar a JavaScript:
function list(){
var args = arguments;
return function(array){
var obj = {};
for(i=0; i<args.length; i++){
obj[args[i]] = array[i];
}
return obj;
};
}
Ejemplo:
var array = ['GET', '/users', 'UserController'];
var obj = {};
obj = list('method', 'route', 'controller')(array);
console.log(obj.method); // "GET"
console.log(obj.route); // "/users"
console.log(obj.controller); // "UserController"
Una alternativa es añadir una lista método para Array.prototype (incluso yo no lo recomendaría):
Array.prototype.list = function(){
var i, obj = {};
for(i=0; i<arguments.length; i++){
obj[arguments[i]] = this[i];
}
// if you do this, you pass to the dark side `,:,´
this.props = obj;
return obj;
};
Ejemplo:
/**
* Example 1: use Array.prototype.props
*/
var array = ['GET', '/users', 'UserController'];
array.list('method', 'route', 'controller');
console.log(array.props.method); // "GET"
console.log(array.props.route); // "/users"
console.log(array.props.controller); // "UserController"
/**
* Example 2: use the return value
*/
var array = ['GET', '/users', 'UserController'];
var props = array.list('method', 'route', 'controller');
console.log(props.method); // "GET"
console.log(props.route); // "/users"
console.log(props.controller); // "UserController"
ES6 no es compatible con esto directamente ahora a través de array destructuring.
const matches = ['12', 'watt'];
const [value, unit] = matches;
¿Qué pasa con un enfoque estándar 'var value = coincidencias [0]; var unidad = coincide con [1]; ' –
Bueno, eso no es muy conciso, ¿verdad? – Kzqai
Nunca sentí 'list()' ser útil y lo anterior simplemente me grita objetar 'var power = {'unit': 'watt', 'amount': 12}' – Gordon