--- title: Array.prototype.find() slug: Web/JavaScript/Referencia/Objetos_globales/Array/find tags: - Array - ECMAScript 2015 - JavaScript - Prototipo - Referencia - metodo - polyfill translation_of: Web/JavaScript/Reference/Global_Objects/Array/find ---
El método find()
devuelve el valor del primer elemento del array que cumple la función de prueba proporcionada.
arr.find(callback(element[, index[, array]])[, thisArg])
callback
element
index
{{optional_inline}}array
{{optional_inline}}find
.thisArg
{{optional_inline}}this
cuando se ejecuta callback
.El valor del primer elemento del array que cumple la función de prueba proporcionada; de lo contrario, devuelve {{jsxref("undefined")}}.
El método find
ejecuta la función callback
una vez por cada índice del array hasta que encuentre uno en el que el callback
devuelva un valor verdadero. Si es así, find
devuelve inmediatamente el valor del elemento. En caso contrario, find
devuelve {{jsxref("undefined")}}.
callback
se invoca con tres argumentos: el valor del elemento, el índice del elemento y el objeto Array
que está siendo recorrido.
Si un parámetro thisArg
es proporcionado al método find
, este será utilizado como this
para cada invocación del callback. Si no se proporciona el parámetro, entonces se utiliza {{jsxref("undefined")}}.
El método find
no transforma el array desde el cual es llamado, pero la función proporcionada en callback
sí. En ese caso, los elementos procesados por find
son establecidos antes de la primera invocación de callback
. Por lo tanto:
callback
no visitará ningún elemento añadido al array después de que comience la llamada a find
.callback
, su valor que se pasa al callback
que lo visita será el valor en el momento en que find
visita ese índice del elemento.const inventario = [ {nombre: 'manzanas', cantidad: 2}, {nombre: 'bananas', cantidad: 0}, {nombre: 'cerezas', cantidad: 5} ]; function esCereza(fruta) { return fruta.nombre === 'cerezas'; } console.log(inventario.find(esCereza)); // { nombre: 'cerezas', cantidad: 5 }
const inventario = [ {nombre: 'manzanas', cantidad: 2}, {nombre: 'bananas', cantidad: 0}, {nombre: 'cerezas', cantidad: 5} ]; const resultado = inventario.find( fruta => fruta.nombre === 'cerezas' ); console.log(resultado); // { nombre: 'cerezas', cantidad: 5 }
El siguiente ejemplo encuentra un elemento en un array que sea un número primo (o devuelve {{jsxref("undefined")}} si no hay un número primo).
function isPrime(element, index, array) { let start = 2; while (start <= Math.sqrt(element)) { if (element % start++ < 1) { return false; } } return element > 1; } console.log([4, 6, 8, 12].find(isPrime)); // undefined, no encontrado console.log([4, 5, 8, 12].find(isPrime)); // 5
Los siguientes ejemplos muestran cómo elementos no existentes o eliminados son visitados y el valor pasado a callback
es su valor cuando son visitados.
// Declarar un array sin elementos en los índices 2, 3 y 4 const array = [0,1,,,,5,6]; // Muestra todos los índices, no sólo aquellos que tienen valores asignados array.find(function(value, index) { console.log('Visited index ' + index + ' with value ' + value); }); // Mostrar todos los índices, incluyendo los eliminados array.find(function(value, index) { // Eliminar el elemento 5 en la primera iteración if (index == 0) { console.log('Deleting array[5] with value ' + array[5]); delete array[5]; } // El elemento 5 se visita aun habiendo sido eliminado console.log('Visited index ' + index + ' with value ' + value); }); // expected output: // Deleting array[5] with value 5 // Visited index 0 with value 0 // Visited index 1 with value 1 // Visited index 2 with value undefined // Visited index 3 with value undefined // Visited index 4 with value undefined // Visited index 5 with value undefined // Visited index 6 with value 6
Este método ha sido añadido a la espeficicación ECMAScript 2015 y puede no estar disponible en todas las implementaciones de JavaScript aún. Sin embargo, puedes utilizar el siguiente polyfill de Array.prototype.find
:
// https://tc39.github.io/ecma262/#sec-array.prototype.find if (!Array.prototype.find) { Object.defineProperty(Array.prototype, 'find', { value: function(predicate) { // 1. Let O be ? ToObject(this value). if (this == null) { throw new TypeError('"this" is null or not defined'); } var o = Object(this); // 2. Let len be ? ToLength(? Get(O, "length")). var len = o.length >>> 0; // 3. If IsCallable(predicate) is false, throw a TypeError exception. if (typeof predicate !== 'function') { throw new TypeError('predicate must be a function'); } // 4. If thisArg was supplied, let T be thisArg; else let T be undefined. var thisArg = arguments[1]; // 5. Let k be 0. var k = 0; // 6. Repeat, while k < len while (k < len) { // a. Let Pk be ! ToString(k). // b. Let kValue be ? Get(O, Pk). // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)). // d. If testResult is true, return kValue. var kValue = o[k]; if (predicate.call(thisArg, kValue, k, o)) { return kValue; } // e. Increase k by 1. k++; } // 7. Return undefined. return undefined; }, configurable: true, writable: true }); }
Si necesitas dar soporte a motores de JavaScript realmente obsoletos que no soportan Object.defineProperty
, es mejor no utilizar el polyfill para los métodos Array.prototype
, ya que no podrás hacerlos no enumerables.
Especificación |
---|
{{SpecName('ESDraft', '#sec-array.prototype.find', 'Array.prototype.find')}} |
{{Compat("javascript.builtins.Array.find")}}