给定一个对象数组
function Example(x, y){
this.prop1 = x;
this.prop2 = y;
}
var exampleArray = new Array();
exampleArray.push(nex Example(0,1));
exampleArray.push(nex Example(1,3));
现在我想添加一个函数来计算其中一个属性
的平均值function calcAvg(exampleArray, 'prop1') -> 0.5
function calcAvg(exampleArray, 'prop2') -> 2
如果我不想使用jQuery或其他库,是否有通用的方法来执行此操作?
答案 0 :(得分:1)
我认为它会起作用,
您需要迭代数组中的所有Example
个对象,并将给定属性的值添加到变量中,例如sum
然后在最后将其除以数组中的对象总数以获得平均值。
console.log(avg(exampleArray, 'prop1'));
function avg (array, propName){
var sum = 0;
array.forEach(function(exm){
sum+= exm[propName];
});
return sum / array.length;
}
答案 1 :(得分:1)
此代码遍历arr
的每个值,在每个值中搜索属性prop
,将该属性的值推送到名为values
的数组,并返回所有值的总和values
中的值除以其中的值数。
function calcAvg(arr,prop){
var values = [];
for(var i = 0; i<arr.length; i++){
values.push(arr[i][prop]);
}
var sum = values.reduce(function(prev,current){
return prev+current;
});
return sum/values.length;
}
演示is here.
答案 2 :(得分:1)
您可以使用Array.prototype.reduce()
。
reduce()
方法对累加器和数组的每个值(从左到右)应用函数以将其减少为单个值。
function Example(x, y) {
this.prop1 = x;
this.prop2 = y;
}
function calcAvg(array, key) {
return array.reduce(function (r, a) {
return r + a[key];
}, 0) / array.length;
}
var exampleArray = [new Example(0, 1), new Example(1, 3)],
avgProp1 = calcAvg(exampleArray, 'prop1'),
avgProp2 = calcAvg(exampleArray, 'prop2');
document.write(avgProp1 + '<br>');
document.write(avgProp2);
答案 3 :(得分:1)
使用Array.prototype.reduce
方法解决并检查有效属性:
function Example(x, y) {
this.prop1 = x;
this.prop2 = y;
}
var exampleArray = new Array();
exampleArray.push(new Example(0, 1));
exampleArray.push(new Example(1, 3));
function calcAvg(arr, prop) {
if (typeof arr[0] === 'object' && !arr[0].hasOwnProperty(prop)) {
throw new Error(prop + " doesn't exist in objects within specified array!");
}
var avg = arr.reduce(function(prevObj, nextObj){
return prevObj[prop] + nextObj[prop];
});
return avg/arr.length;
}
console.log(calcAvg(exampleArray, 'prop2')); // output: 2