使用reduce()计数 - 值来自何处?

时间:2018-01-16 10:26:19

标签: javascript reduce

在学习过滤掉在数组中只出现一次的值时,我遇到了一段非常有用的代码,我根据自己的需要进行了调整。我开始分析如何计算一个值的重复计数。下面我有一个计数功能。

function countInstancesOfAppearance(word) {
    var letters = word.split('');

    return countLetters = letters.reduce(function(object, key) {
      object[key] = object[key] ? object[key] + 1 : 1;
      return object;
    }, {});
}

结果是:{l: 1, a: 1, s: 2, o: 1}

但是,我无法理解object[key] + 1 : 1背后的情况。对我来说,更清楚的是以下列方式编写函数:

function countInstancesOfAppearance(word) {
    var letters = word.split('');

    return countLetters = letters.reduce(function(object, key) {
      if (object[key] = object[key]) {
        object[key] = object[key] + 1; 
      } else {
        object[key] = 1;
      }

      return object;
    }, {});
}

更好地描述我的推理:

var obj = {};
obj.cat = ""; // obj = {cat: ""};
obj.cat + 1 // in console, it gives 1, but the object continues to be obj = {cat: ""};
obj.cat = 1 // only now we have obj = {cat: 1};
obj.cat + 1 // the object continues to be obj = {cat: 1};
obj.cat = obj.cat + 1 //only now we have obj = {cat: 2};

那么请你解释一下reduce()方法如何利用以下条件obj.cat + 1中的1object[key] = object[key] ? object[key] + 1 : 1;来进行正确的分配?

以下是console.logs的代码:

function countInstancesOfAppearance(word) {
    var letters = word.split('');

    return countLetters = letters.reduce(function(object, key) {
    console.log("object", object);
    console.log("key", key);
    console.log("object[key] = object[key]", object[key] = object[key]);
      object[key] = object[key] ? object[key] + 1 : 1;
      return object;
    }, {});
}

它的输出:

enter image description here

2 个答案:

答案 0 :(得分:1)

检查ternary operator documentation

libraryDependencies += "org.apache.bcel" % "bcel" % "5.2"

可以改写

object[key] = object[key] ? object[key] + 1 : 1;

答案 1 :(得分:1)

条件运算符的赋值运算符为higher precedence,因此

object[key] = object[key] ? object[key] + 1 : 1;

相当于

object[key] = (object[key] ? object[key] + 1 : 1);

object[key]设置为1,如果它是undefined0(因为这些值是假的),并且在大多数其他情况下会增加。