添加对象属性值的JavaScript数组以获得总数

Add JavaScript Array of Object properties values to get a total count number

本文关键字:数组 JavaScript 对象 属性 添加      更新时间:2023-09-26

基于如下所示的JavaScript对象数组,是否有可能将所有项目的count属性上的数值加在一起并存储在一个变量中作为总数而不迭代数组?

var category_names_array = [
  {name: 'cat1', count: 13},
  {name: 'cat2', count: 23},
  {name: 'cat3', count: 33}
];

这是核的,你说的迭代是什么意思?你必须访问数组的所有索引才能做到这一点。如果您只是想避免for循环,那么使用Array.prototype.reduce函数。

var total = category_names_array.reduce(function(a, b){
    return a + b.count;
}, 0);

如果将迭代定义为对数组索引的有序访问,那么如果要处理数组的所有索引,就必须对数组进行迭代。即使使用JSON对对象进行字符串化,然后对字符串进行过滤和求值仍然是迭代的——JSON必须遍历数组来对其进行字符串化。无论您做什么,都必须遍历数组的索引来处理它。注意,即使将两个整数相加也是一种迭代——迭代它们的位以将它们相加。

可以。

sum(counts(array))

天哪,这是多么好读啊。但是,现在我们需要写counts。最简单的方法是

function counts(array) { return array.map(elt => elt.count); }

map是否构成"迭代"?取决于你的定义。让我们说不,因为迭代发生在引擎内部!!

剩下的就是写sum

如果不遍历数组,则不可能实现您所要求的。

你想要实现的是一个reduce操作,在我看来这是一个线性时间算法。也就是说,它保证遍历JS数组中的每个元素。

使用Lodash JS的示例解决方案

var category_names_array = [
  {name: 'cat1', count: 13},
  {name: 'cat2', count: 23},
  {name: 'cat3', count: 33}
];
 var total = _.reduce(category_names_array, function(totalCount,item) {
  return totalCount + item.count;
},0);

复杂度O (n)

您可以使用递归方法

function sum(a, s) {
    s = s || 0;
    a = a.slice();
    return a.length ? sum(a, s + a.pop().count) : s;
}
var category_names_array = [{ name: 'cat1', count: 13 }, { name: 'cat2', count: 23 }, { name: 'cat3', count: 33 }];
console.log(sum(category_names_array));

ES6

function sum(a) {
    var f = (a, ...r) => (s += a.count, r.length && f(...r)),
        s = 0;
    f(...a);
    return s;
}
var category_names_array = [{ name: 'cat1', count: 13 }, { name: 'cat2', count: 23 }, { name: 'cat3', count: 33 }];
console.log(sum(category_names_array));