values template not last item handlebars example javascript jquery join

javascript - not - handlebars template js



¿Por qué no funciona.join() con argumentos de función? (8)

No funciona porque el objeto arguments no es una matriz, aunque parece que sí. No tiene método de join :

>>> var d = function() { return ''['' + arguments.join(",") + '']''; } >>> d("a", "b", "c") TypeError: arguments.join is not a function

Para convertir arguments a una matriz, puede hacer:

var args = Array.prototype.slice.call(arguments);

Ahora join funcionará:

>>> var d = function() { var args = Array.prototype.slice.call(arguments); return ''['' + args.join(",") + '']''; } >>> d("a", "b", "c"); "[a,b,c]"

Alternativamente, puede usar makeArray de jQuery, que intentará convertir "casi-arrays" como arguments en matrices:

var args = $.makeArray(arguments);

Esto es lo que la referencia de Mozilla (mi recurso favorito para este tipo de cosas) tiene que decir al respecto:

El objeto arguments no es una matriz. Es similar a una matriz, pero no tiene ninguna propiedad de matriz, excepto la length . Por ejemplo, no tiene el método pop. ...

El objeto arguments está disponible solo dentro de un cuerpo de función. Intentar acceder al objeto arguments fuera de una declaración de función da como resultado un error.

¿Por qué funciona esto? (Devuelve "uno, dos, tres"):

var words = [''one'', ''two'', ''three'']; $("#main").append(''<p>'' + words.join(", ") + ''</p>'');

y este trabajo (devuelve "la lista: 111"):

var displayIt = function() { return ''the list: '' + arguments[0]; } $("#main").append(''<p>'' + displayIt(''111'', ''222'', ''333'') + ''</p>'');

pero esto no (vuelve en blanco):

var displayIt = function() { return ''the list: '' + arguments.join(","); } $("#main").append(''<p>'' + displayIt(''111'', ''222'', ''333'') + ''</p>'');

¿Qué tengo que hacer con mi variable "arguments" para usar .join () en ella?


No sé si hay una manera simple de convertir argumentos en una matriz, pero puedes intentar esto:

var toreturn = "the list:"; for(i = 0; i < arguments.length; i++) { if(i != 0) { toreturn += ", "; } toreturn += arguments[i]; }


Podrías usar esta jQuery .joinObj Extension / Plugin I made.

Como verá en ese violín, puede usarlo de la siguiente manera:

$.joinObj(args, ",");

o

$.(args).joinObj(",");

Código de complemento:

(function(c){c.joinObj||(c.extend({joinObj:function(a,d){var b="";if("string"===typeof d)for(x in a)switch(typeof a[x]){case "function":break;case "object":var e=c.joinObj(a[x],d);e!=__proto__&&(b+=""!=b?d+e:e);break;default:"selector"!=x&&"context"!=x&&"length"!=x&&"jquery"!=x&&(b+=""!=b?d+a[x]:a[x])}return b}}),c.fn.extend({joinObj:function(a){return"object"===typeof this&&"string"===typeof a?c.joinObj(this,a):c(this)}}))})(jQuery);


Por el momento no puede unir los argumentos de la matriz, porque no son una matriz, que se muestra aquí

así que primero tienes que convertirlos en una matriz como esta,

function f() { var args = Array.prototype.slice.call(arguments, f.length); return ''the list: '' + args.join('',''); }

o así, un poco más corto

function displayIt() { return ''the list: '' + [].join.call(arguments, '',''); }

si está utilizando algo como babel o un navegador compatible para usar las características de es6, también puede hacerlo usando argumentos de descanso.

function displayIt(...args) { return ''the list: '' + args.join('',''); } displayIt(''111'', ''222'', ''333'');

que te permitiría hacer cosas aún más geniales como

function displayIt(start, glue, ...args) { return start + args.join(glue); } displayIt(''the start: '', ''111'', ''222'', ''333'', '','');


Puedes usar typeof para ver qué está pasando aquí:

>>> typeof([''one'', ''two'', ''three'']) "object" >>> typeof([''one'', ''two'', ''three''].join) "function" >>> typeof(arguments) "object" >>> typeof(arguments.join) "undefined"

Aquí puede ver que typeof devuelve "objeto" en ambos casos, pero solo uno de los objetos tiene una función de unión definida.


Si no está interesado en otros métodos Array.prototype y desea simplemente usar join , puede invocarlo directamente, sin convertirlo a una matriz:

var displayIt = function() { return ''the list: '' + Array.prototype.join.call(arguments, '',''); };

También puede ser útil saber que la coma es el separador predeterminado, si no define un separador, por spec usará la coma.


Simplemente use la función de utilidad jQuery makeArray

arguments no es una matriz, es un objeto. Pero, dado que es tan "similar a una matriz", puede llamar a la función de utilidad jQuery makeArray para que funcione:

var displayIt = function() { return ''the list: '' + $.makeArray(arguments).join(","); } $("#main").append(''<p>'' + displayIt(''111'', ''222'', ''333'') + ''</p>'');

Que dará salida:

<p>the list: 111,222,333</p>


arguments no es un objeto jQuery, solo un objeto JavaScript regular. .join() antes de intentar llamar a .join() . Creo que escribirías:

return ''the list:'' + $(arguments)[0];

(No estoy muy familiarizado con jQuery, solo Prototype, así que espero que esto no sea completamente falso.)

Editar: ¡Está mal! Pero en su respuesta, Doug Neiner describe lo que estoy tratando de lograr.