2

我正在寻找一种将 max/min 函数添加到 JavaScript 的 Array 类的方法,这似乎是一个已解决的问题:JavaScript: min & max Array values? . 但是,当我尝试使用它时,我开始从我的代码中收到错误。事实证明,这种方法不适用于循环。

for(i in myArray) { console.log(i) } 

打印出来


1 
2
3
最大
分钟

我可以使用另一种方法吗?

4

5 回答 5

10

公认的解决方案可以解决您的直接问题,但扩展核心对象通常不是一个好主意。当您稍后包含一个使用的库时会发生什么for..in?或者当您在几个月后忘记并在代码的不同部分使用错误的方法时?

另一种选择是包装和扩展。创建一个使用 的实例Array作为其原型的新类型:

function ArrayThing() {}

ArrayThing.prototype = new Array();

现在你有了一个可以扩展而不影响的对象Array

ArrayThing.prototype.max = function() {
    return Math.max.apply(null, [].slice.call(this, 0))
}

ArrayThing.prototype.min = function() {
    return Math.min.apply(null, [].slice.call(this, 0))
}

var list = new ArrayThing();

// standard array methods still work
list.push(5);
list.push(22);
list.push(0);
list.push(-14);
list.length // => 4

// as do your new custom methods
list.max() // => 22
list.min() // => -14

这并不适用于所有情况,但除非你确定你真的非常需要一个Array,这是一个有用的选择。

于 2011-02-16T19:49:44.603 回答
6

for...in循环用于循环遍历对象的属性。如果要从数组中获取值,可以这样做:

for (var i = 0; i < myArray.length; i++)
{
    console.log(myArray[i])
}
于 2011-02-16T19:15:43.870 回答
2

for in是一个常见的 Javascript 陷阱。foreach它实际上枚举给定对象中的所有属性,而不是像其他语言那样表现。

由于 Javascript 数组碰巧有每个索引的属性 usingfor in有时,但正如您所看到的,它还会枚举您添加的任何其他属性。另一个问题是for in不能保证以任何特定顺序遍历属性,因此您的结果可能会因您使用的浏览器/运行时而异。

那么,只使用一个无聊的for循环会更安全。Javascript中有很多for循环习语,所以我将列出一些:

常规 for 循环:

for(i=0; i<arr.length; i++){

常规循环,缓存长度:

for(i=0, n=arr.length; i<n; i++){

循环对象/节点列表数组:

for(i=0; obj=arr[i]; i++){ //this works as long as the array has no falsy values
    foo(obj)
于 2011-02-16T19:25:19.100 回答
1

您需要使用 hasOwnProperty 进行检查。但是,这需要在您循环的任何地方应用。

IE:

for(i in myArray)
{
  if(arr.hasOwnProperty(i))
  {
   console.log(i);
  }
}
于 2011-02-16T19:15:33.503 回答
0

现在有一种更现代的(IE9+)方法可以做到这一点:

var g = []; 

Object.defineProperty(g, "log", {
  enumerable: false,
  configurable: false,
  writable: false,
  value: function(){ console.log(this); }
});


g.push(5); 
g.push(9); 

var t;
for (t in g){
    console.log(g[t]);
}

打印 5 和 9 但未列出“日志”功能

g.log() -> echos [5,9]

这项工作的关键是能够将属性标记为“可枚举:false”,并将该属性标记为不应该被迭代的东西。

更多关于 Object.defineProperty 的信息: https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

于 2014-08-21T14:47:42.760 回答