Los amigos que han usado subrayado saben que tiene una API muy completa para llamar al recorrido de las matrices (conjuntos), y _.each () es uno de ellos. Aquí hay un ejemplo simple:
var arr = [1, 2, 3, 4, 5]; _. Cada (arr, function (el) {console.log (el);});El código anterior emitirá 1, 2, 3, 4, 5 a su vez. ¿No es muy interesante? Ni siquiera tienes que escribir un bucle para ti mismo. El método _.each () es muy útil para atravesar las matrices, pero su implementación interna no es difícil en absoluto. Echemos un vistazo a cómo se implementa _.each (). Antes de esto, echemos un vistazo a la API de _.each (). _.each () generalmente se llama como sigue:
_.each (arr, fn, contexto);
Recibe 3 parámetros,
La primera es una matriz que necesita ser atravesada (en realidad, también es posible ser un objeto, así que discutamos esto más adelante);
El segundo es su función de devolución de llamada (esta función de devolución de llamada puede pasar en 3 parámetros, como: función (El, i, arr), que son el elemento actual, el índice actual y la matriz original, respectivamente);
El tercero es el contexto al que debe estar obligado la función de devolución de llamada, es decir, especificar este valor de la función de devolución de llamada fn.
Ok, las necesidades son muy claras, ¡comencemos a trabajar!
Primero implementemos el _.each (), que no puede modificar el contexto esto, y recibe dos parámetros. El código es el siguiente:
var _ = {}; // Suponga que ese es el subscore // la implementación más simple del _.each Method_.each = function (arr, fn) {for (var i = 0; i <arr.length; i ++) {fn (arr [i], i, arr); } return arr; // Devuelve la matriz original}¿Qué tal? ¿No es muy simple? Simplemente use un bucle for y siga llamando a la función de devolución de llamada. Se puede hacer en unas pocas líneas de código. ¡Creo que ningún amigo puede entenderlo! Vamos a probarlo para ver si funciona normalmente:
var arr = [1, 2, 3, 4, 5]; _. Cada (arr, function (el, i, arr) {console.log (el);});Abra en el navegador y la consola verá la salida correcta.
Un código tan simple no tiene ningún significado. Echemos un vistazo a un ejemplo más desafiante. Por ejemplo, Array ARR tiene una propiedad de suma. Necesitamos sumar todos los elementos de la matriz y almacenarlos en la suma, como sigue:
var arr = [1, 2, 3, 4, 5]; arr.sum = 0; // El atributo de suma se usa para almacenar la suma de los elementos de matriz_.each (arr, la función (el, i, arr) {this.sum += el;});En este momento, esto se usa en la función de devolución de llamada. Si no está vinculado, esta es la ventana por defecto. Esto no es lo que queremos. Esperamos que esté atado a la matriz arr. Llamar o aplicar puede implementar esta función, el código es el siguiente:
var _ = {}; // Suponga que este es el enlace subrayador //, reciba dos parámetros fn y context // ata fn al contexto var bind = function (fn, context) {context = context || nulo; función de retorno (el, i, arr) {fn.call (context, el, i, arr); }} // _.each_.each = function (arr, fn, context) {// llame al método de enlace y vincule fn al contexto fn = bind (fn, context); for (var i = 0; i <arr.length; i ++) {fn (arr [i], i, arr); } return arr;} // Caso de prueba: var arr = [1, 2, 3, 4, 5]; arr.sum = 0; // El atributo de suma se usa para almacenar la suma de los elementos de matriz_.each (arr, la función (el, i, arr) {this.sum += el;}, arr); console.log (arr.sum); // 15Ok, este _.each () ya es lo suficientemente potente como para iterar a través de la matriz normalmente, y también puede especificar este valor a voluntad para cambiar el contexto de la función de devolución de llamada. Sin embargo, como mencionamos anteriormente, el _.each () de bajo valor () también puede atravesar objetos, y esta implementación no es difícil. Simplemente juzgue si el primer parámetro transmitido es un objeto o una matriz. Si es una matriz, itera como nosotros. De lo contrario, si es un objeto, use los objetos para ... en el recorrido de bucle. Si está interesado, puede probarlo usted mismo o consultar el código fuente del bajo.
Nota: Desde el estándar ES5, las matrices nativas ya tienen métodos transversales como Array.Prototype.Foreach, Array.Prototype.Map, etc., y los nativos pueden usarse en el proyecto.
Lo anterior es la descripción completa del análisis en profundidad del método de transversal de matriz JS (recomendado) introducido por el editor. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje y el editor responderá a todos a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!