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

JavaScript实现自恋数判断函数报错:test.map不是函数,求修复

解决自恋数判断函数中的test.map is not a function错误

问题描述

我正在写一个JavaScript函数判断十进制自恋数,自恋数的定义是:一个数等于其各位数字的位数次幂之和,比如153(3位)满足1^3 +5^3 +3^3=153,1634(4位)满足1^4+6^4+3^4+4^4=1634。

我的需求是编写函数接收有效整数,返回true或false判断是否为自恋数,但运行代码时控制台报错test.map is not a function,请问该怎么调整?

我的代码

function narcissistic(value) { 
  let valString = value.toString().split(''); 
  let integerSet = valString.map((item)=>{ 
    return Number(item); 
  }) 
  let keyFunc = function powerCalc(test){ 
    let a = test[test.length-1]; 
    return test.map((item)=>{ 
      return Math.pow(item, a); 
    }).reduce((total, item)=>{ 
      return total + item; 
    }, 0); 
  } 
  console.log(keyFunc(153)); 
  if(keyFunc(integerSet)==value){ 
    return true; 
  } else { 
    return false; 
  } 
} 
console.log(narcissistic(12432)); 
console.log(narcissistic(153));

错误原因与修复方案

1. 直接导致报错的原因:参数类型不匹配

你看这行代码:console.log(keyFunc(153)); —— 你的powerCalc函数设计是接收数组(比如后面传入的integerSet),但这里你直接传了数字153。数字类型没有map方法,所以调用test.map的时候自然会抛出test.map is not a function的错误。

2. 隐藏的逻辑错误:幂次计算错误

另外你在powerCalc里用test[test.length-1]来获取幂次,这是完全错误的逻辑!比如对于153的数组[1,5,3],test.length-1是2,取到的是最后一位数字3,刚好和位数一致,但如果是1634的数组[1,6,3,4],test.length-1是3,取到的是4,这时候你会错误地用4作为幂次吗?不对,幂次应该是数字的位数,也就是test.length,而不是最后一位数字!

修正后的完整代码

function narcissistic(value) { 
  // 一步到位:把数字转成各位数字的数组
  const digitArray = value.toString().split('').map(item => Number(item)); 
  // 获取数字的位数,也就是需要用到的幂次
  const digitCount = digitArray.length;

  // 计算各位数字的digitCount次幂之和
  const calculatePowerSum = (arr) => {
    return arr
      .map(digit => Math.pow(digit, digitCount))
      .reduce((sum, current) => sum + current, 0);
  };

  // 直接返回比较结果,简化逻辑
  return calculatePowerSum(digitArray) === value;
} 

// 测试用例
console.log(narcissistic(12432)); // 输出 false
console.log(narcissistic(153));   // 输出 true
console.log(narcissistic(1634));  // 输出 true

代码优化点说明

  • 去掉了错误的keyFunc(153)调用,如果需要测试内部函数,应该传入对应的数组(比如[1,5,3])。
  • 修正了幂次逻辑:用digitArray.length(数字的总位数)作为每个数字的幂次,这才符合自恋数的定义。
  • 简化了代码结构:把字符串转数组和转数字的步骤合并,用箭头函数让代码更简洁,同时去掉冗余的if-else,直接返回比较结果。
  • 变量和函数命名更清晰:比如digitArray、calculatePowerSum,让代码可读性更高。

这样修改后,函数就能正常运行,不会再抛出错误,同时也能准确判断一个数是否为自恋数了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 07:52:42