如何使用数组减少来求和对象属性长度,不带类型

How do I use array reduce to sum object property lengths w/o typeof

本文关键字:类型 属性 对象 数组 何使用 求和      更新时间:2023-09-26

我有一个对象数组,每个对象都包含其他对象的数组。我想使用 reduce 来求和所有这些数组的长度。为此,我似乎必须首先提供这样的typeof检查......

var totalTasks = $scope.list.reduce(function(a, b){
  var aNum = 0, bNum = 0;
  if(typeof a === "object" && a.subItems){
      aNum = a.subItems.length
  }
  else{
      aNum = a
  }
  if(b.subItems) {
      bNum = b.subItems.length;
  }
  return aNum + bNum;
});

似乎必须有一种方法可以在没有类型的情况下做到这一点。有什么想法吗?

您所

要做的就是为累加器提供一个初始值:

var totalTasks = $scope.list.reduce(function(num, el) {
  return num + el.subItems.length;
}, 0);
// ^

在这里,您可以确定num始终是一个数字。如果您需要检查el是否真的存在并包含subItems,当然可以添加(num + (el && el.subItems && el.subItems.length || 0))。

为什么不使用起始值并检查a.subItems是否是数组?

var totalTasks = $scope.list.reduce(function(r, a){
    if ('subItems' in a && Array.isArray(a.subItems) {
        return r + a.subItems.length;
    }
    return r;
}, 0);
相关文章: