我一直在寻找一种方法来将最大/最小函数添加到JavaScript的Array类中,这似乎是一个已解决的问题:JavaScript: min & max Array values?。但是,当我尝试使用它时,我开始从我的代码中获取错误。事实证明,这种方法不适用于循环。
for(i in myArray) { console.log(i) }
prints out 1
2
3
max
min
我可以使用另一种方法吗?
答案 0 :(得分:10)
已接受的解决方案可以解决您的直接问题,但扩展核心对象通常是bad idea。如果您以后使用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
,否则这是一个有用的选择。
答案 1 :(得分:6)
for...in
循环用于循环对象的属性。如果要从数组中获取值,可以执行以下操作:
for (var i = 0; i < myArray.length; i++)
{
console.log(myArray[i])
}
答案 2 :(得分:2)
for in
是一个常见的Javascript陷阱。它不是像其他语言中的foreach
那样表现,而是枚举给定对象中的所有属性。
由于Javascript Arrays碰巧有时会使用for in
为每个索引创建一个属性,但正如您所见,它还会枚举您添加的任何其他属性。另一个问题是for in
无法保证按任何特定顺序浏览属性,因此您的结果可能会因您使用的浏览器/运行时而异。
然后,使用无聊的for
循环更安全。 Javascript中有许多for
循环习语,所以我将列出一些:
常规循环:
for(i=0; i<arr.length; i++){
常规循环,缓存长度:
for(i=0, n=arr.length; i<n; i++){
循环对象/ NodeLists数组:
for(i=0; obj=arr[i]; i++){ //this works as long as the array has no falsy values
foo(obj)
答案 3 :(得分:1)
您需要使用hasOwnProperty进行检查。 但是,这需要应用于循环的任何位置。
即:
for(i in myArray)
{
if(arr.hasOwnProperty(i))
{
console.log(i);
}
}
答案 4 :(得分: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]
这项工作的关键是能够将属性标记为“enumerable:false”,并将属性标记为不应迭代的属性。
更多关于Object.defineProperty的信息: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty