具体示例了解reduce()方法JavaScript

时间:2017-10-03 11:08:36

标签: javascript

有人可以解释一下reduce()如何计算数组项的实例并将它们添加到下面代码中的空对象中?例如,我们最终得到{ car: 5, truck: 3 }。我不太明白obj[item]是什么。

const data = ['car', 'car', 'truck', 'truck', 'bike', 'walk', 'car', 'van', 'bike', 'walk', 'car', 'van', 'car', 'truck' ];

const transportation = data.reduce(function(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}

3 个答案:

答案 0 :(得分:2)



const data = ['car', 'car', 'truck', 'truck', 'bike', 'walk', 'car', 'van', 'bike', 'walk', 'car', 'van', 'car', 'truck' ];

const transportation = data.reduce(function(obj, item) {
      console.log(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}




如果你可以看到控制台输出,你会看到对象obj将作为一个数据结构,其中键作为数组元素,值作为频率,如果属性未定义,它将被初始化为0,在进一步的步骤中,我们只需要增加该值。

obj [item]是对象的属性。当一个唯一的字符串出现并且将被初始化为0时会创建这个,在每个下一步我们只会增加这个值

  

注意在reduce中,第一个参数是上一次迭代传递的对象(最初为{})。第二个将遍历每个元素

答案 1 :(得分:1)

Array.prototype.reduce()

你可以发现第一个回调函数是累加器。这是您的obj - >减少的结果。 item是正在处理的 currentValue - >在你的情况下是数组data中的一个字符串。 obj[item]用于存储item数组中出现data个字符串的次数的计数。

答案 2 :(得分:1)

让我们举一个更简单的例子:将数组中的所有整数加在一起。

const data = [1, 2, 3, 4, 5];
const sum = data.reduce(function(total, num) {
  return total + num;
}, 0);

reduce接受一个有两个参数的函数:1)total,累加器,传递到进程的下一次迭代,并设置为0初始化value,和2)num,迭代中当前正在处理的元素。

对于每次迭代,num被添加到总数中,在最后一次迭代之后,传递到sumthe result is 15)。

在您的示例中,空对象充当累加器,值(项)被添加为对象键

const transportation = data.reduce(function(obj, item) {

  // if the object does not have a key matching the value
  // of item, create it and set it to zero
  // for example: obj['car'] = 0
  if (!obj[item]) {
    obj[item] = 0;
  }

  // Now we increase the value of that property because
  // we want to indicate an instance of that car, bike, truck etc
  // For example `obj['car']++`
  obj[item]++;

  // Then we return the object (accumulator) for the next
  // iteration
  return obj;
}, {});