【问题标题】:Javascript Error undefined is not a functionJavascript错误未定义不是函数
【发布时间】:2015-02-24 23:04:11
【问题描述】:

首先,很抱歉我的问题很幼稚。我正在自学 Javascript,但我并不真正理解错误。

var centuryGroup = grouping(ancestry, function(person){
   return Math.ceil(person.died/100);
});

function grouping(array, group){
  var groups = {};
  array.forEach(function(element) {
    var groupName = group(element);
    if(groupName in groups){
      groups[groupName].push(element); //the error is stated at this line
    }
    else{
      groups[groupName] = element;
    }
  });
  return groups;
}

如上所述,错误在

groups[groupName].push(element);

如果我删除它,它会起作用。

并且,如果它定义为:

function grouping(array, group) {
  var groups = {};
  array.forEach(function(element) {
    var groupName = group(element);
    if (groupName in groups)
      groups[groupName].push(element);
    else
      groups[groupName] = [element];
  });
  return groups;
}

var centuryGroup = grouping(ancestry, function(person) {
  return Math.ceil(person.died / 100);
});

第二个没有错误。 *第二个代码取自教程。

我尝试过的事情:

  1. 我把“var CenturyGroup = ...”放在函数分组下面...仍然没有区别
  2. 当我注释掉错误行时,我已确保代码正常工作
  3. 我已从 if 和 else 语句中删除了 {},但错误仍然存​​在(我并不认为它会产生影响)

*确切的错误是“TypeError undefined is not a function”

我很茫然。 谢谢大家的帮助


*编辑。

传入的“数组”的内容是

{ name: "Carolus Haverbeke" }
  sex:  "m"
  born: 1832
  died: 1905
  father:   "Carel Haverbeke"
  mother:   "Maria van Brussel"
{ name: "Emma de Milliano" }
  sex:  "f"
  born: 1876
  died: 1956
  father:   "Petrus de Milliano"
  mother:   "Sophia van Damme"
...

顺便说一句,如果它不应该具有“push”属性,那么第二个代码不应该工作。但它是并且它正在显示预期的结果。 *困惑


已解决! 这是我在

中的错误

元素

感谢 Pointy 为我指出了这个错误。正如他所说,它的原因是它不是一个数组,因此 .push 不起作用。但是一旦我将它作为 [element] 并将其放入数组中,那么我将能够将它作为数组的对象 .push 。谢谢大家

【问题讨论】:

  • 这个错误意味着groups[groupName] 所指的任何东西都没有push 属性。也就是说,您的代码假定它是一个数组,但它是某种其他类型的对象。教程中element周围的[ ]是关键。
  • 出于好奇,您为什么将“else”语句中的[element] 更改为element
  • 不是一个直接的答案,但你可以使用像 lodash 或 underscore 这样的库,它们确实提供了一些常见的基本功能,比如摸索
  • @HarishR 哇,我需要再次查看这些库
  • 到@Pointy,哇。那是错误。它应该是[元素]。但为什么呢?

标签: javascript


【解决方案1】:

此问题已在问题下的 cmets 中得到回答,并且答案已编辑到问题本身中。

【讨论】:

    【解决方案2】:

    else 语句中您没有创建新数组,仅此而已。任何不是 aray 的东西都没有 push() 功能。您在 else 语句中的代码应该是:

    groups[groupName] = element;
    

    应该是:

    groups[groupName] = []; // Create empty array
    groups[groupName].push('element'); // push an element to array
    

    或者:

    groups[groupName] = [element]; // create array with one element
    

    附: 不要在没有打开/结束花括号的情况下使用if/else 语句,总有一天你会在脚上开枪......

    if (groupName in groups) {
      groups[groupName].push(element);
    } else {
      groups[groupName] = [element];
    }
    

    【讨论】:

    • 就像我提到的,不带大括号的来自一本教程书,带大括号的是我的代码 ==
    猜你喜欢
    • 2020-11-07
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 2013-06-21
    • 2015-04-05
    相关资源
    最近更新 更多