Quiero especificar dinámicamente valores negativos como se ve en esta pregunta exacta.
¿Reglas para claves literales de objetos de JavaScript sin comillas?
También quiero lograr esto usando algún método de notación de corchetes dinámicos, usando una cadena equivalente a un resto negativo (operación de módulo).
bucketObj[clave] informes indefinidos, ya que no he preconfigurado una clave para almacenar un valor correspondiente. ¿Cómo configuro dinámicamente una clave de un objeto en notación de paréntesis, notación de puntos o ambas?
function toDigitBuckets(array, radix) { let bucket = JSON.parse(JSON.stringify([...Array(radix).fill([])])); let bucketObj = Object.assign(bucket); array.forEach(val => { let key = String.toString(val % 10); bucketObj[key].push(val) }); return bucket; } let array = [-7, -49, 84, 39, -31, 95, 7, -8, -13, -32, 93, 40, -81, -30, -57, -57, 49, 66, -64, 42, 35, 29, -57, 41, 93, 34, -45, -15, 51, 16, 97, -88, 52, -69, 56, -16, -91, 51, 10, -21, 80, 78, -5, 18, -20, -98, 72, -94, 11, -83, -31, 13, -21, 39, -47, 8, -98, 95, 52, -18, 77, -11, -38, -46, -98, 48, -45, -4, 76, -32, -81, 67, -82, 9, -60, -20, 0, 33, -12, 77, 65, 45, -22, 99, -47, -83, -81, 10, -99, 16, 23, 5, -57, 89, -62, 9, -16, 79, 5, -2]; let radix = 10; console.log(JSON.stringify(toDigitBuckets(array, radix)));Puede usar Array#reduce con un objeto como acumulador. Cada vez que se encuentra una nueva clave, primero establezca el valor de esa propiedad para que sea una matriz vacía.
function toDigitBuckets(array, radix) { return array.reduce((acc, curr) => ((acc[curr % radix] ??= []).push(curr), acc), {}); } let array = [-7, -49, 84, 39, -31, 95, 7, -8, -13, -32, 93, 40, -81, -30, -57, -57, 49, 66, -64, 42, 35, 29, -57, 41, 93, 34, -45, -15, 51, 16, 97, -88, 52, -69, 56, -16, -91, 51, 10, -21, 80, 78, -5, 18, -20, -98, 72, -94, 11, -83, -31, 13, -21, 39, -47, 8, -98, 95, 52, -18, 77, -11, -38, -46, -98, 48, -45, -4, 76, -32, -81, 67, -82, 9, -60, -20, 0, 33, -12, 77, 65, 45, -22, 99, -47, -83, -81, 10, -99, 16, 23, 5, -57, 89, -62, 9, -16, 79, 5, -2]; let radix = 10; console.log(toDigitBuckets(array, radix)); .as-console-wrapper{max-height:100%!important;top:0}