类型错误:this.reduce不是一个函数。

29

在向Array原型添加方法后,某些不相关的脚本出现了问题。

  • [Opera] 未处理错误:'this.reduce'不是一个函数
  • [Firefox] TypeError:this.reduce不是一个函数

该方法本身有效([1,2,3].xintsum() 正常输出 6)。

// adding a function to the Array prototype
Array.prototype.xintsum = function() { return this.reduce(function(old, add) {return old + add;}, 0); };

// accessing the array in a way that worked before
$(document).ready(function (){
  var some_array = [];
  for (head_n in some_array) {
    var v = some_array[head_n];
    $('<th></th>').text(v);
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


this 应该引用什么?你确定它是一个 array 吗? - Sterling Archer
1
在Chrome中,我得到了“未捕获的类型错误:对象#<HTMLTableCellElement>没有reduce方法”。 - gen_Eric
3个回答

5
这是因为你在数组上使用了for..in。这样做是不正确的。
当你添加Array.prototype.xintsum时,你为每个数组都添加了一个xintsum属性。所以,发生的情况是,你的for循环遍历了数组的这个属性。
该属性的值是一个函数。当你将函数传递给.text()时,jQuery会像这样调用它:
v.call(ele, index text);

这是将this设置为元素。但是,DOM元素没有.reduce函数。

你需要像这样循环:

for(var i = 0; i < some_array.length; i++){
    var v = some_array[i];
}

或者使用some_array.forEach();) - Scimonster
或者您可以使用 ES6 中的 for...of。这个循环解决了遍历非元素属性的问题。 - prgmrDev

1

这段代码:

var v = some_array[head_n];
$('<th></th>').text(v);

当涉及到xintsum时,与此相同:

$('<th></th>').text(function() { 
    return this.reduce(function(old, add) {
        return old + add;
    }, 0); 
});

当将函数传递给text时,该函数会针对jquery对象中包含的每个元素调用一次。对于每个调用,this指的是那个dom元素。在这种情况下,您创建的是th。因此,错误消息让您知道th没有这样的函数。

0

v()<th> 元素的上下文中被调用,而不是在数组中。因此,<th> 没有 reduce() 方法。这是因为 for ... in 循环遍历非数字属性和数字属性一样。我建议改用 some_array['head'].forEach()


1
我认为问题在于你正在对一个数组使用'for in'。因此,你会在检查中得到原型.. for in...做一个for循环,你的问题应该就可以解决了。你不应该对数组使用'for in',那是用于关联数组/哈希表的。对于数组,请使用"for"。我认为这就是你的问题所在。 - james emanon
1
不客气。顺便说一下,控制台日志通常比警报更容易,因为它们不会阻塞,并且通常可以让您更彻底地检查对象。 - Scimonster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接