基于如下所示的JavaScript对象数组,是否可以将所有项的count属性上的数字值相加并存储在变量中作为总计数而不迭代数组?
var category_names_array = [
{name: 'cat1', count: 13},
{name: 'cat2', count: 23},
{name: 'cat3', count: 33}
];
答案 0 :(得分:1)
很清楚迭代是什么意思。您必须访问阵列的所有索引才能执行此操作。如果您只想避免for
循环,请使用Array.prototype.reduce
函数。
var total = category_names_array.reduce(function(a, b){
return a + b.count;
}, 0);
如果我们将迭代定义为对数组索引的有序访问,那么我们必须迭代数组,如果我们想要处理它的所有索引。甚至使用JSON对对象进行字符串化,然后过滤和评估字符串仍在迭代--JSON必须遍历数组以对其进行字符串化。无论你做什么,你都必须迭代数组的索引来处理它。请注意,即使添加两个整数也是某种迭代 - 您迭代它们的位以将它们组合在一起。
答案 1 :(得分:0)
是的,你可以。
package main
import (
"os/exec"
"sync"
)
func main() {
var lock sync.Mutex
cmd := exec.Command("sleep", "10")
lock.Lock()
if err := cmd.Start(); err != nil {
panic(err)
}
lock.Unlock()
go func() {
cmd.Process.Kill()
}()
cmd.Wait()
}
我的,这是多么可读。但是ooops,现在我们需要写sum(counts(array))
。最简单的方法是
counts
function counts(array) { return array.map(elt => elt.count); }
构成"迭代"?取决于你的定义。让我们说不,因为迭代发生在引擎内部!!
剩下的就是写map
。我们将此作为练习留给读者。
答案 2 :(得分:0)
您可以使用递归方法
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));

答案 3 :(得分:0)
如果没有 迭代数组 ,就无法实现您的要求。
您希望实现的是 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)