2009-12-23 14 views
50

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?

+0

¿Qué pasa con un enfoque estándar 'var value = coincidencias [0]; var unidad = coincide con [1]; ' –

+7

Bueno, eso no es muy conciso, ¿verdad? – Kzqai

+1

Nunca sentí 'list()' ser útil y lo anterior simplemente me grita objetar 'var power = {'unit': 'watt', 'amount': 12}' – Gordon

Respuesta

37

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 :)

+6

¡Claro! ¡Realmente me gustan todas las cosas geniales que han puesto en las nuevas versiones de Javascript! Solo siento que no podremos usarlos durante años ... – Znarkus

+0

¿Dónde está el código? –

+1

@David https://developer.mozilla.org/en/New_in_JavaScript_1.7#section_20 – Znarkus

17

intente esto:

matches = ['12', 'watt']; 
[value, unit] = matches; 
+2

Funciona en FF4 pero no en Chrome 12. De todos modos, genial! – Znarkus

2

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.

4

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; 
    } 
} 
+0

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" –

+0

Usar 'ventana' como objeto predeterminado es una muy mala idea. – Bergi

+0

@Bergi solo lo usa de manera predeterminada. Puede proporcionar un objeto como último parámetro y lo usará. – micahblu

0

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.

-2
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 
1

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" 

Check the fiddle


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" 

Check the fiddle for that one

6

ES6 no es compatible con esto directamente ahora a través de array destructuring.

const matches = ['12', 'watt']; 
const [value, unit] = matches; 
Cuestiones relacionadas