2012-08-15 29 views
8

Si bien la interfaz del método .map() es .map(callback(index, domElement)), es $.map(array, callback(elementOfArray, indexInArray)) para $ .map() ... ¿Alguna idea sobre el motivo por el que $ .map() elige colocar los argumentos devueltos en un orden como valor-índice?

+0

También vale la pena señalar que' .map' aplana implícitamente matrices anidadas también. – Esailija

Respuesta

2

Si se estudia la API de jQuery se dará cuenta de que todos los métodos que funcionan en un conjunto de elementos seleccionados y aceptan devoluciones de llamada, tales como .each, .html, .text, etc., todos pasan el índice del elemento como primer argumento, es decir, .map está en línea aquí. Normalmente se accede al elemento actual con this dentro de la devolución de llamada, este es solo un patrón común en jQuery, por lo que los desarrolladores podrían haber decidido que es más importante tener el índice como primer argumento.

Por otro lado, el método nativo Array.prototype.map pasa el valor del elemento como primer argumento de la devolución de llamada, por lo que parece tener sentido que $.map funciona de la misma manera, ya que se supone proceso de un conjunto genérico de artículos.

+0

Suena como una explicación válida =) – Kay

7

Porque la API es imperfecta. Comenzó inconsistente, pero arreglarlo ahora rompería el código existente que usa $.map().

+0

Lo intrigado mí es que esto no parece como una cosa difícil de hacer desde el primer lugar. – Kay

+0

Es cierto, pero ni siquiera se agregaron en la misma versión de jQuery. '$ .map()' se agregó en v1.0, pero '.map() 'no se agregó hasta v1.2. La moraleja de la historia es que un buen diseño de API es muy difícil, y el diseño de API perfecto es prácticamente imposible. –

1

Sí, existe una diferencia entre jQuery(). Map() y jQuery.map().

esbozar algunas diferencias:

jQuery.map() = esto tiende a iterar sobre la colección genérica

() Mapa() = objetos Array-como debe ser echado a las matrices de jQuery . (.makeArray())

jQuery.map() = predominantemente utilizado para obtener o establecer el valor de una colección de elementos y devolver que new array

También .map() es una función ECMAScript5, y se define fuera de jQuery (aunque está implementado). Uno se pregunta si jQuery(). Map() era una implementación más antigua. .map() es aparentemente más rápido!

John Resig afirma: "jQuery.map está diseñado principalmente para ser utilizado con matrices de elementos DOM (como se describe en la documentación) .Por esta razón, hace cosas como quitar null/undefined y apila arreglos de nodos en una sola matriz ". Esto es como se define en ECMA (Mozilla). La otra implementación es el propio de Resig, de ahí la diferencia. Eso no es un diseño pobre !!!!!! Read

Segunda razón: "No es tan simple como 'fijación' ... de devolución de llamada de jQuery.map tiene orden parámetro que coincide con Array.prototype.map, mientras que el fin de parámetro jQuery.fn.map juego el resto del jQuery objeto iterator callback param order.El cambio a una u otra rompería la compatibilidad hacia atrás, lo que jQuery toma grandes esfuerzos para evitar" Read