You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript如何用对象字面量、括号表示法、扩展语法单行动态赋值键值对

问题分析与解决

原代码核心问题

  • 你初始化的bucket是长度为radix的数组,默认只有0~radix-1的非负整数索引有对应空数组,负数字符串类型的key未被初始化,访问时返回undefined,调用push方法会抛出错误。
  • String.toString(val % 10)语法错误,正确的数值转字符串写法为String(val % 10)或者(val % 10).toString()。
  • 数组的负索引本质是对象的自定义属性,不会被计入数组长度,也不会在数组的常规遍历中被读取,用普通对象作为桶容器更适配负key的需求。

修复后代码

function toDigitBuckets(array, radix) {
  const bucketObj = {};
  array.forEach(val => {
    const remainder = val % radix;
    const key = String(remainder);
    // 动态初始化不存在的key对应的空数组
    if (!bucketObj[key]) {
      bucketObj[key] = [];
    }
    bucketObj[key].push(val);
  });
  return bucketObj; 
}

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)));
动态设置对象键的规则说明
  • 包含特殊字符(如负号、空格、数字开头)的键仅支持括号表示法访问和设置,无法使用点表示法:比如bucketObj[-7]是合法写法,bucketObj.-7会直接抛出语法错误。
  • 括号表示法会自动将传入的key转为字符串类型匹配属性,因此bucketObj[-7]和bucketObj["-7"]的执行效果完全一致。
  • 如果可以枚举所有可能的key值,也可以提前批量初始化所有key对应的空数组,避免遍历时的判断逻辑。

内容的提问来源于stack exchange,提问作者Vahe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 05:12:00