Quiero que ignore el elemento con la inicial "recebeu" y solo envíe lo que comienza con "usuario", ¿cómo puedo hacer eso?...
const array = [ { member: "Joao", user: { user: "id1", user2: "id2", user3: "null", recebeuuser: "null" }, }, { member: "Pedro", user: { user: "id1", user2: "id2", user3: "null", recebeuuser: "name" }, }, ]; const filteredUsers = (user) => Object.values(user).filter(u => u !== 'null' && typeof u === 'string' ) const mentionUser = (user) => `<@${user}>` const stringify = (m) => `${m.member} - ${filteredUsers(m.user).map(mentionUser).join(', ')}` console.log(array.map(stringify).join('\n'))
Joao - <@id1>, <@id2> Pedro - <@id1>, <@id2>, <@name>
Creo que parte del problema es que estás usando muchos atajos sin comprender completamente la forma de lo que estás pasando. Recomendaría simplificar el código y evitar la notación abreviada.
Aquí hay una versión refactorizada de lo que está haciendo usando un bucle for...of
iterando sobre Object.entries()
de la propiedad de user
de cada objeto pasado. Si la clave y el valor pasan todas las condiciones, se envía una cadena formateada a la matriz de users
. Finalmente devuelve la cadena completamente formateada.
function stringifyMember(memberObject) { const { member, user } = memberObject; const users = []; for (const [k, u] of Object.entries(user)) { if (k.startsWith('user') && u !== 'null' && typeof u === 'string') { users.push(`<@${u}>`) } } return `${member} - ${users.join(', ')}` } const array = [{ member: "Joao", user: { user: "id1", user2: "id2", user3: "null", recebeuuser: "null" }, }, { member: "Pedro", user: { user: "id1", user2: "id2", user3: "null", recebeuuser: "name" }, },]; console.log(array.map(m => stringifyMember(m)).join('\n'))
ver también: