script convertir coffee javascript jquery coffeescript

javascript - convertir - js to coff



Manera limpia de eliminar elemento de javascript array(con jQuery, coffeescript) (8)

Aunque está pidiendo un enfoque limpio usando Coffeescript o jQuery, encuentro que el enfoque más limpio es utilizar el filter método vainilla javascript:

array.filter(function (item) { return item !== match });

Se ve más limpio en coffeescript, pero esto se traduce en exactamente el mismo javascript, por lo que solo lo considero una diferencia visual, y no una función avanzada de coffeescript:

array.filter (item) -> item isnt match

El filtro no es compatible con los navegadores heredados, pero Mozilla proporciona un polyfill que se adhiere al estándar ECMA. Creo que este es un enfoque perfectamente seguro porque solo lleva navegadores antiguos a los estándares modernos, y no está inventando ninguna nueva funcionalidad en su polyfill.

Lo siento si buscabas específicamente un método jQuery o Coffeescript, pero creo que principalmente pedías un método de biblioteca porque no conocías un método limpio solo de JavaScript.

Ahí lo tienes, ¡no se necesitan bibliotecas!

Hay muchas preguntas sobre esto, no menos importante: jQuery versión de matriz contiene , una solución con el método de empalme y muchas más. Sin embargo, todos parecen complicados y molestos.

Con los poderes combinados de javascript, jQuery y coffeescript, ¿cuál es la forma más limpia de eliminar un elemento de una matriz javascript? No conocemos el índice por adelantado. En codigo:

a = [4,8,2,3] a.remove(8) # a is now [4,2,3]

Si falla un buen método incorporado, ¿cuál es una forma limpia de extender las matrices de JavaScript para admitir dicho método? Si ayuda, realmente estoy usando matrices como conjuntos. Las soluciones idealmente funcionarán muy bien en coffeescript con el soporte de jQuery. Además, no podría importarme menos la velocidad, sino priorizar un código claro y simple.


CoffeeScript:

Array::remove = (e) -> @[t..t] = [] if (t = @indexOf(e)) > -1

Que simplemente empalma el elemento en la posición t , el índice donde se encontró e (si realmente se encontró t > -1 ). Coffeescript traduce esto a:

Array.prototype.remove = function(e) { var t, _ref; if ((t = this.indexOf(e)) > -1) { return ([].splice.apply(this, [t, t - t + 1].concat(_ref = [])), _ref); } };

Y si desea eliminar todos los elementos coincidentes, y devolver una nueva matriz, utilizando CoffeeScript y jQuery:

Array::remove = (v) -> $.grep @,(e)->e!=v

que se traduce en:

Array.prototype.remove = function(v) { return $.grep(this, function(e) { return e !== v; }); };

O haciendo lo mismo sin grep de jQuery:

Array::filterOutValue = (v) -> x for x in @ when x!=v

que se traduce a:

Array.prototype.filterOutValue = function(v) { var x, _i, _len, _results; _results = []; for (_i = 0, _len = this.length; _i < _len; _i++) { x = this[_i]; if (x !== v) { _results.push(x); } } return _results; };


Esto es realmente fácil con jQuery:

var index = $.inArray("value", myArray); if(index != -1) { myArray.splice(index, 1); }

Notas:

splice devuelve los elementos que se eliminaron, por lo tanto, no haga myArray = myArray.splice() . myArray.splice(index,1) significa "eliminar el elemento de la matriz en el índice ''index'' de la matriz".

$.inArray devuelve el índice en la matriz del valor que está buscando, o -1 si el valor no está en la matriz.


Esto es solo un pequeño cambio en la asombrosa solución de Amir :

Array::remove = (e) -> @splice(t,1)[0] if (t = @indexOf(e)) > -1

que devuelve el elemento si la lista lo tiene, por lo que puede hacer algo como:

do_something 100 if a.remove(100)

El script de quitar café se traduce a este javascript:

Array.prototype.remove = function(e) { var t, _ref; if ((t = this.indexOf(e)) > -1) { return ([].splice.apply(this, [t, t - t + 1].concat(_ref = [])), _ref); }};


Esto parece bastante limpio y comprensible; a diferencia de otras respuestas, toma en cuenta la posibilidad de que un elemento aparezca más de una vez.

Array.prototype.remove = function (value) { for (var i = 0; i < this.length; ) { if (this[i] === value) { this.splice(i, 1); } else { ++i; } } }

En CoffeeScript:

Array::remove = (value) -> i = 0 while i < @length if @[i] == value @splice i, 1 else ++i return @


Puede probar la utilidad grep de jQuery:

a = [4,8,2,3] $.grep(a,function(v){return v!=8;})

Puede haber un problema de rendimiento aquí, ya que técnicamente hace que la variable haga referencia a una nueva matriz; en realidad no estás modificando el original. Suponiendo que el original no está referenciado en otro lugar, el recolector de basura debería tomarlo o esto bastante rápido. Esto nunca ha sido un problema para mí, pero otros podrían saberlo mejor. ¡Aclamaciones!


Usando vainilla Javascript:

Array.prototype.remove = function(elem) { var match = -1; while( (match = this.indexOf(elem)) > -1 ) { this.splice(match, 1); } }; var a = [4, 8, 2, 3]; a.remove(8);

Solo jQuery:

jQuery.removeFromArray = function(value, arr) { return jQuery.grep(arr, function(elem, index) { return elem !== value; }); }; var a = [4, 8, 2, 3]; a = jQuery.removeFromArray(8, a);


si también está utilizando la biblioteca underscore.js del creador de CoffeeScript, aquí hay una línea que funcionará muy bien:

a = _(a).reject (v)-> v is e

o en js:

a = _(a).reject(function(v) { return v == e; });