Un caso de uso un poco diferente de los que me sugirieron anteriormente. Necesito recorrer y verificar cada nombre de archivo dentro de una matriz de archivos y enviar los archivos que tienen el mismo nombre a una nueva matriz para poder cargarlos más tarde por separado.
Este es mi código hasta ahora, y seguramente tengo un problema con mi verificación condicional, ¿alguien puede ver lo que estoy haciendo mal?
filesForStorage = [ {id: 12323, name: 'name', ...}, {id: 3123, name: 'abc', ...}, {id: 3213, name: 'name', ...}, ... ] filesForStorage.map((image, index) => { for (let i = 0; i < filesForStorage.length; i++) { for (let j = 0; j < filesForStorage.length; j++) { if ( filesForStorage[i].name.split(".", 1) ===. //.split('.', 1) is to not keep in consideration the file extension filesForStorage[j].name.split(".", 1) ) { console.log( "----FILES HAVE THE SAME NAME " + filesForStorage[i] + " " + filesForStorage[j] ); } } }Usar el map sin devolver nada lo hace casi inútil. Puede usar forEach pero eso es igualmente inútil cuando está usando un bucle doble dentro: significa que estaría haciendo un bucle una vez en el foreach (o map en su caso) y luego dos veces más dentro, lo que hace que el rendimiento sea increíblemente malo.
Lo que realmente está tratando de hacer es agrupar sus elementos por name y luego elegir cualquier grupo con más de 1 elemento
const filesForStorage = [ {id: 12323, name: 'name'}, {id: 3123, name: 'abc'}, {id: 3213, name: 'name'} ] const grouped = Object.values( filesForStorage.reduce( (a,i) => { a[i.name] = a[i.name] || []; a[i.name].push(i); return a; },{}) ); console.log(grouped.filter(x => x.length>1).flat());JavaScript tiene varias funciones que realizan una iteración "oculta".
Object.values a través de un objeto de pares clave-valor y recopilará todos los valores en una matrizArray.prototype.reduce iterará a través de una matriz y realizará un cálculo para cada elemento y finalmente devolverá un valor únicoArray.prototype.filter iterará a través de una matriz y recopilará todos los elementos que devuelvan verdadero para una prueba específicaArray.prototype.flat iterará a través de una matriz, concatenando cada elemento con el siguiente, para crear una nueva matriz aplanadaTodos estos métodos son un desperdicio, ya que puede calcular una colección de duplicados con un solo paso sobre la matriz de entrada. Además, los métodos de matriz ofrecen el rendimiento O(n) en el mejor de los casos, en comparación con el rendimiento O(1) de Set o Map, lo que hace que la elección de matrices para este tipo de cálculo sea increíblemente mala:
function* duplicates (files) { const seen = new Set() for (const f of files) { if (seen.has(f.name)) yield f else seen.add(f.name, f) } } const filesForStorage = [ {id: 12323, name: 'foo'}, {id: 3123, name: 'abc'}, {id: 3213, name: 'foo'}, {id: 4432, name: 'bar'}, {id: 5213, name: 'qux'}, {id: 5512, name: 'bar'}, ] for (const d of duplicates(filesForStorage)) console.log("duplicate name found", d) duplicate name found { "id": 3213, "name": "foo" } duplicate name found { "id": 5512, "name": "bar" }Un bucle anidado puede ser muy costoso en rendimiento, especialmente si su matriz tendrá muchos valores. Algo así sería mucho mejor.
filesForStorage = [ { id: 12323, name: 'name' }, { id: 3123, name: 'abc' }, { id: 3213, name: 'name' }, { id: 3123, name: 'abc' }, { id: 3213, name: 'name' }, { id: 3123, name: 'random' }, { id: 3213, name: 'nothing' }, ] function sameName() { let checkerObj = {}; let newArray = []; filesForStorage.forEach(file => { checkerObj[file.name] = (checkerObj[file.name] || 0) + 1; }); Object.entries(checkerObj).forEach(([key, value]) => { if (value > 1) { newArray.push(key); } }); console.log(newArray); } sameName();