Tengo una matriz de objetos con dos propiedades: canais y topicos :
channel: Array(3) 0: {canais: 'canal1', topicos: 'topico1'} 1: {canais: 'canal2', topicos: 'topico2'} 2: {canais: 'canal3', topicos: 'topico3'}Quiero dividir en dos matrices de cadenas llamadas canais y topicos:
canais : [ "canal1" , "canal2", "canal3" ]; topicos: [ "topico1" , "topico2", "topico3" ];Tu puedes hacer
const canais = channel.map(item => item.canais) const topicos = channel.map(item => item.topicos)Podrías hacer esto de varias maneras:
Asigne cada elemento a una matriz de 2 elementos [canais, topicos] y luego transponga el resultado para obtener dos matrices (aquí el original es su matriz):
const transpose = arr => arr[0].map((x, i) => arr.map(x => x[i])) const [canais, topicos] = transpose(original.map(a => [a.canais, a.topicos])) Ver también: Transposición de una matriz 2D en JavaScript, que es el origen de la función de transpose anterior.
Use un bucle forEach y acumule:
const canais = [] const topicos = [] original.forEach(el => { canais.push(el.canais) topicos.push(el.topicos) }) Normal for bucle y acumular:
const allCanais = [] const allTopicos = [] for (const {canais, topicos} of original) { allCanais.push(canais) allTopicos.push(topicos) } Asigne dos veces (primero extraiga todos los el.canais y luego todos los el.topicos ), aunque esto itera dos veces sobre los datos, lo que probablemente no sea necesario.
Si necesita que sea dinámico, puede usar un bucle for anidado para recorrer cada elemento y crear/agregar matrices en función de la clave, luego use un objeto para almacenar cada matriz de valores.
let channelNames = {}; for(let c of channel){ for(let key in c){ if(!channelNames[key]) channelNames[key] = []; channelNames[key].push(i[key]); } }