【问题标题】:Sum of object properties within an array数组中对象属性的总和
【发布时间】:2015-01-10 18:40:26
【问题描述】:

我有一个带有属性的数组,例如:

var arrayPeople = [
    {
        name: 'joe',
        job: 'programmer',
        age: 25,
    },
    {
        name: 'bob',
        job: 'plumber',
        age: 30,
    };
];

我想创建一个函数来返回他们的平均年龄,这是我目前所拥有的不起作用

var ageAverage = function(array) {
    var age = 0, average;
    for (var i = 0; i < array.length; i++) {
        age += array[i].age;
    }
    average = age / array.length;
    return average;
};

我在运行这个函数时得到的是Not A Number

但我可以去工作的是:

var ageAverage = function(array) {
    var age = 0, average;
    for (var i = 0; i < array.length; i++) {
        age = array[0].age;
    }
    average = age / array.length;
    return average;
};

这里的细微差别是我去掉了+=,只是把它变成了=,我去掉了变量i的使用,只是给了它数组的第一个索引。因此,在执行此操作时,我知道该函数正确地将参数数组替换为 arrayPeople,但我的 for 循环中出现了问题,阻止 i 变为 0 和 1(arrayPeople 的索引)。

P.S. 我正在尝试自己做这件事,我并不是在找人来为我解决问题,我真的很感激一些关于要解决什么问题的提示,或者也许是概念我需要研究了解如何解决这个问题。

谢谢!!

【问题讨论】:

  • 尝试将 array[i].age 转换为数字。还要初始化变量,这是很好的做法。不要使用数组作为变量的名称,在某些语言中它是保留字。还要检查你的对象数组,有一些错误(逗号和分号)
  • 对象数组中特定属性值的总和:ARRAYNAME.reduce(function (a,b) { return a + b.PROPERTYNAME; }, 0)

标签: javascript for-loop


【解决方案1】:

考虑使用mapreduce

arrayPeople.
  map(function(item){ return item.age; }).
  reduce(function(a, b){ return a + b; }, 0) / arrayPeople.length;

或者只是@KooiInc 指出的reduce

arrayPeople.reduce(function (a,b) { return a + b.age; }, 0) / arrayPeople.length;

一个有效的例子:

var arrayPeople = [{
    name: 'joe',
    job: 'programmer',
    age: 25,
  }, {
    name: 'bob',
    job: 'plumber',
    age: 30,
  }],
  average = arrayPeople.reduce(function(a, b) {
    return a + b.age;
  }, 0) / arrayPeople.length;

document.write(average);

【讨论】:

  • 你不需要映射部分:arrayPeople.reduce(function (a,b) {return a + +b.age;}, 0);
  • 谢谢,这对我来说是新的,我一直在研究它,但我找不到的一件事是如何调用它。我可以将其存储在变量中吗?我最终在 innerHTML 中使用输出的值,它将显示 html 页面上的平均数字,所以我需要有类似的东西: document.getElementById('htmlid').innerHTML = " The average is " + (我们的在这里回答这个问题);
  • 感谢您的帮助和详细的示例,非常感谢。
【解决方案2】:

你需要初始化age变量(var age = 0

var arrayPeople = [{
  name: 'joe',
  job: 'programmer',
  age: 25,
}, {
    name: 'bob',
    job: 'plumber',
    age: 30,
}];

var ageAverage = function(array) {
  var age = 0,
      average;

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

  average = age / array.length;
  return average;
};

console.log(
  ageAverage(arrayPeople)
);

在您的变体中,age 变量等于 undefined,而 undefined += number(例如 25)返回 NaN

在此行中也将, 更改为;

来自

for (var i = 0, i < array.length; i++) {

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

【讨论】:

    【解决方案3】:

    总有一条线。

    arrayPeople.reduce((a, o, i, p) => a + o.age / p.length, 0));
    

    console.log(`${[{
        name: 'joe',
        job: 'programmer',
        age: 25,
      },
      {
        name: 'bob',
        job: 'plumber',
        age: 30,
      }
    ].reduce((a, o, i, p) => a + o.age / p.length, 0)}%`);

    【讨论】:

    • 它不起作用。它为“a”提供了 [Object][Object],您可以在其中执行 + o.age。虽然我使用 reduce 来获取数组中所有对象的年龄总和,但逻辑是相同的。当我做 a.age + o.age 时,它​​起作用了,但是当数组中有一个元素时它仍然会出现问题。
    • 嗨@shanti,很可能你在reduce方法中传递了一个对象作为初始值,你能提供一个你的代码的工作示例吗?如果 a.age 有效,则您的累加器 (a) 是一个对象而不是一个数字。
    • reduce 方法中的第一个参数是累加器,第二个是费用列表中的当前项。试试这个:expenseList.reduce((totalExpense, currentExpense) =&gt; { return totalExpense + currentExpense.amount }, 0)。无需访问totalExpense 中的amount 属性,因为这是结果(累加器)。希望我是清楚的,我在我的电话。如果有任何疑问,请随时告诉我,我会举个例子。
    • 对不起,我之前的评论被误删了。这是我之前的评论——“我是这样使用的,expenseList.reduce((expense1,expense2) => { return fee1.amount + fee2.amount }, 0),是的,所以 Angular 将累加器视为一个对象。这个如果我的列表中有超过 1 项费用,则有效。如果只有一个列表项,则总和为 NaN" [上一条评论结束] ----
    • 不用担心,随时!这是一个例子jsfiddle.net/5gr44co6:-)
    【解决方案4】:

    您应该将 for 更改为:

    for (var i = 0; i

    并赋予年龄初始值

    var age=0
    

    【讨论】:

    • 感谢您的回复,这是一个错字,在我的真实代码中我使用分号而不是逗号,我的错误
    • 你的代码是不是还是不能用我测试过返回:27.5
    猜你喜欢
    • 2017-11-08
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    相关资源
    最近更新 更多