2016-01-19 27 views
3

是否有任何一种内置方法可以在没有循环的情况下遍历对象参数。就像数组对象有方法(forEach,sort,filter ..)。 例如有一个阵列可以在JavaScript中循环使用函数吗?

var numbers = [3,342,23,22,124]; 
var max = 0; 
for(var i=0;i<numbers.length;i++){ 
    if(numbers[i] > max){ 
     max = numbers[i]; 
    } 
} 
alert(max); 

相反循环sort()方法可以用来

var numbers = [3,342,23,22,124]; 
numbers.sort(function(a,b){return b - a}); 
alert(numbers[0]); 

是否有规则物体{}在JavaScript中的任何方法,将工作方式相同sort()

更普遍的是有没有办法避免这样的循环:

for(var parameter in object){ 
    var data = object[parameter] 
    exampleMethod(data); 
} 

有没有循环中执行的函数几次呢?

+3

对象键是无序,所以排序是不可能的。最接近循环的是获取键并在这些键上运行数组方法。 – tymeJV

回答

4

不,但您可以经常使用像Object.keys()这样的函数来打开通往Array原型方法(如.forEach())的路径。

Object.keys()方法返回一个数组,其中包含对象的“自己”属性名称。 (“自己的”名称是直接在对象上的属性名称,而不是从原型链继承而来)。从那里,可以使用像.forEach这样的数组方法遍历属性名称,并通过使用它们来引用对象,通过属性值也是如此。

例如,考虑这个对象:

var dimensions = { 
    length: 20, 
    height: 30, 
    width: 40 
}; 

如果你想总结一下边缘,你可以这样做:

var perimeter = Object.keys(dimensions).reduce(function(sum, dkey) { 
    sum += 4 * dimensions[dkey]; 
    return sum; 
}, 0); 

还要注意相关的方法Object.getOwnPropertyNames()Object.getOwnPropertySymbols(),从而扩大可用于迭代的属性。

+0

我正在建议lodash'双'。你的回答比较好。尽管旧IE(<9)不支持这种ES5功能。 (虽然polyfill可能比某些额外的东西更好) –

+1

@BenMosher是真的,但MDN有一个polyfill。 – Pointy

+0

@imanEngineer不,没有简单的方法来执行对象的每个值。不是没有循环键和获取值。 – tymeJV

1

不喜欢排序,因为JavaScript对象中没有属性顺序。但是,您可以使用Object.keys和map来将对象转换为值数组。

var o = {a:1,b:3, c, :2}; 
    var arr = Object.keys(o).map(key=>o[key]).sort((a,b)=>b-a); 
    var max = arr[0]; 

对于经常反复,结合键和foreach

Object.keys(o).forEach(key=>console.log('key',key, 'value', o[key])); 
相关问题