代码之家  ›  专栏  ›  技术社区  ›  Tim

Array reduce函数——为什么这两个(看起来相当的)函数返回不同的对象

  •  1
  • Tim  · 技术社区  · 7 年前

    我有一个数组, 数据 ,有几个项目重复。我试图使用数组上的reduce方法返回一个包含每个项的对象,以及该项在 数据 大堆

    第一个减速功能正常工作。第二个是我想出的,在我看来是一样的,只是没有检查 if(!obj[item]) 我正在检查 if(obj[item]) 使用else块。我不知道这两种解决方案有何不同,尽管它们必须。。。好像是我的 (obj[item]) 从来都不是真的,因为我每件物品的计数都是0。

    const data = ['car', 'car', 'truck', 'truck', 'bike', 'walk', 'car', 'van', 'bike', 'walk', 'car', 'van', 'car', 'truck'];
    
    const transportation = data.reduce((obj, item) => {
      if (!obj[item]) {
        obj[item] = 0;
      }
      obj[item]++;
      return obj;
    }, {});
    console.log(transportation); //  {car: 5, truck: 3, bike: 2, walk: 2, van: 2}
    
    
    var instances = data.reduce((totalObj, item) => {
      if (totalObj[item]) {
        totalObj[item]++;
      } else {
        totalObj[item] = 0;
      }
      return totalObj;
    }, {});
    
    console.log(instances); // {car: 0, truck: 0, bike: 0, walk: 0, van: 0}
    1 回复  |  直到 7 年前
        1
  •  3
  •   Nina Scholz    7 年前

    您需要使用初始化属性 1 ,因为您要计数,而零是 falsy .

    totalObj[item] = 1;
    

    const data = ['car', 'car', 'truck', 'truck', 'bike', 'walk', 'car', 'van', 'bike', 'walk', 'car', 'van', 'car', 'truck' ];
    
    var instances = data.reduce((totalObj, item) => {
      if (totalObj[item]) {
        totalObj[item]++;
      } else {
        totalObj[item] = 1;
      }
      return totalObj;
    }, {});
    
    console.log(instances);