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

JavaScript如何获取数组中布尔变量的名称而非其值

核心原因

布尔值是JavaScript的原始值类型,当你把变量存入数组时,数组仅保存true/false本身,不会携带任何原变量名的关联信息。原始值按值传递,赋值完成后数组元素和原变量没有绑定关系,不存在能直接从布尔值反推原变量名的内置方法——毕竟任意数量的变量都可以存储同一个true值,引擎无法判断你要关联哪个名称。

可行实现

你要求所有布尔值存储在数组中,不需要改用对象做外层存储,只需要调整数组内的元素结构,让每个元素同时保存选项名称和对应的布尔状态即可,完全符合你的存储要求。

另外你的原代码存在两个小bug:

  • 循环条件写了i <= dinnerOptions.length,数组下标从0开始,最后一个有效下标是dinnerOptions.length - 1,这个条件会导致多遍历一次取到undefined
  • 循环变量i没有用let/var声明,会泄漏成全局变量

修正后的完整代码:

function dinnerPreferences(){
  var isChinese = false;
  var isItalian = true;
  var isIndian = false;
  var isHomemade = true;
  var isTakeout = false;

  // 数组存储,每个元素同时记录名称和布尔值
  var dinnerOptions = [
    { name: 'isChinese', checked: isChinese },
    { name: 'isItalian', checked: isItalian },
    { name: 'isIndian', checked: isIndian },
    { name: 'isHomemade', checked: isHomemade },
    { name: 'isTakeout', checked: isTakeout }
  ];
  console.log("Dinner options values: " + dinnerOptions.map(item => item.checked));

  function getPreferences(){
    var wantedDinnerOptions = [];
    for(let i = 0; i < dinnerOptions.length; i++){
      if(dinnerOptions[i].checked){
        wantedDinnerOptions.push(dinnerOptions[i].name);
      }
    }
    console.log("选中的偏好值对应名称: ", wantedDinnerOptions); // 输出: ["isItalian", "isHomemade"]
    console.log("选中的偏好数量: " + wantedDinnerOptions.length)
  }
  getPreferences();
}
dinnerPreferences();

如果你不想额外声明零散的布尔变量,也可以直接把配置写在数组里,逻辑更简洁:

const dinnerOptions = [
  { name: 'isChinese', checked: false },
  { name: 'isItalian', checked: true },
  { name: 'isIndian', checked: false },
  { name: 'isHomemade', checked: true },
  { name: 'isTakeout', checked: false }
];

不要尝试通过遍历作用域、匹配变量值的方式找名称,这类实现性能极差且不可靠,只要有两个变量值相同就会出现匹配错误,上述显式存储名称的方案是唯一稳定可维护的实现方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 14:45:35