数组缩减功能 - 为什么这两个(看似相同的)函数返回不同的对象

时间:2018-01-27 21:21:04

标签: javascript arrays

我有一个数组,数据,有几个重复的项目。我正在尝试在数组上使用reduce方法返回包含每个项目的对象以及该项目在 data 数组中出现的次数。

第一个缩小功能正常工作。第二个,我想出的那个,在我看来是相同的,除了检查if(!obj[item])我正在用else块检查if(obj[item])。我无法弄清楚这两种解决方案是如何不同的,尽管它们必须......似乎我的(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 个答案:

答案 0 :(得分:3)

您需要使用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);