const buildVectorData = (vector, toHue, toHex) => { const sqMag = vectorDot(vector, vector); const mag = Math.sqrt(sqMag); const unit = vector.map(c => c / mag); const hue = toHue(vector); const hex = toHex(vector); return { vector, sqMag, mag, unit, hue, hex }; }; const buildClusterData = (size, inertia, mu1, mu2, mu3, nu1, nu2, nu3, toHue, toHex) => ({ size, inertia, mu: buildVectorData([mu1, mu2, mu3], toHue, toHex), nu: [nu1, nu2, nu3], }); const buildPokemonData = ([name, size, ...values]) => ({ name, jab: { total: buildClusterData(size, ...values.slice(0, 7), jab2hue, jab2hex), clusters: [ buildClusterData(...values.slice(7, 15), jab2hue, jab2hex), buildClusterData(...values.slice(15, 23), jab2hue, jab2hex), buildClusterData(...values.slice(23, 31), jab2hue, jab2hex), ], }, rgb: { total: buildClusterData(size, ...values.slice(31, 38), rgb2hue, rgb2hex), clusters: [ buildClusterData(...values.slice(38, 46), rgb2hue, rgb2hex), buildClusterData(...values.slice(46, 54), rgb2hue, rgb2hex), buildClusterData(...values.slice(54, 62), rgb2hue, rgb2hex), ], }, }); const pokemonData = databaseV2.map(row => buildPokemonData(row));