Estoy tratando de mejorar la complejidad del tiempo y la calidad del fragmento de código a continuación. Estoy iterando a través de una matriz para verificar si el elemento de esta matriz existe en el objeto, si esto fuera cierto, debería devolver el nombre que coincide con la identificación del elemento en el objeto. ¿Cómo puedo hacer esto sin tener un bucle anidado? ¿Alguien puede decirme qué puedo hacer para mejorar este algo, por favor?
Gracias a todos de antemano.
let genres = [28, 12, 878]; data = { genres: [ { id: 28, name: 'Action', }, { id: 12, name: 'Adventure', }, { id: 16, name: 'Animation', }, { id: 35, name: 'Comedy', }, { id: 80, name: 'Crime', }, { id: 99, name: 'Documentary', }, { id: 18, name: 'Drama', }, { id: 10751, name: 'Family', }, { id: 14, name: 'Fantasy', }, { id: 36, name: 'History', }, { id: 27, name: 'Horror', }, { id: 10402, name: 'Music', }, { id: 9648, name: 'Mystery', }, { id: 10749, name: 'Romance', }, { id: 878, name: 'Science Fiction', }, { id: 10770, name: 'TV Movie', }, { id: 53, name: 'Thriller', }, { id: 10752, name: 'War', }, { id: 37, name: 'Western', }, ], }; const getGenreName = () => { let result = []; for (let genre of data.genres) { //console.log("genre", genre.name) for (let id of genres) { //console.log('id',genres[i]) if (id === genre.id) result.push(genre.name); } } console.log(result); }; getGenreName();Puede usar reduce e includes como otros ya han mostrado. Esto hará que el código sea un poco más limpio, pero no cambiará la complejidad general del tiempo de ejecución. Para mejorar la complejidad del tiempo de ejecución, es posible que deba usar una estructura de datos diferente.
Por ejemplo en lugar de
let genres = [1,2,3,4]; como una matriz simple, podría usar un Set , que tiene un mejor rendimiento de búsqueda.
let genres = new Set([1,2,3,4]);Entonces puedes usar esto de la siguiente manera
let result = data.genres .filter(g => genres.has(g.id)) .map(g => g.name); y no necesitará ningún explícito for bucles
La mejora más simple probablemente sería convertir genres en un Conjunto https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set y usar el método has para verificar si cada ID en los datos es un miembro del conjunto de géneros escogidos.
También puede convertir los datos en un mapa con los id como claves para buscar rápidamente por id en lugar de hacer un bucle, pero eso solo es más rápido si los datos se reutilizan muchas veces.
JavaScript #reduce en el ejemplo descrito a continuación tendría una complejidad de tiempo O(n). Esto solo recorre la matriz una vez. Podríamos usar el filtro y el mapa, pero tendríamos que recorrer la matriz dos veces.
const getGenreName = () => { const genreSet = new Set(genres); return data.genres.reduce((accumulator, { id, name }) => { if (genreSet.has(id)) accumulator.push(name); return accumulator; }, []); }; console.log(getGenreName()); // [ 'Action', 'Adventure', 'Science Fiction' ] Estamos inicializando el reductor para comenzar con la matriz [] , o una matriz vacía, y luego verificando si la propiedad de genre del objeto está incluida en la matriz de genres , si no lo está, devuelva el acumulador, si lo está. , agréguelo al final del acumulador y devuélvalo.