【问题标题】:How do I build an object counting occurrences in an Array in JavaScript?如何在 JavaScript 的数组中构建对象计数出现次数?
【发布时间】:2019-01-19 01:16:03
【问题描述】:

我想计算数组中某个数字出现的频率。例如,在 Python 中,我可以使用 Collections.Counter 来创建一个字典,用于记录某个项目在列表中出现的频率。

这是我在 JavaScript 中得到的:

var array = [1,4,4,5,5,7];
var obj = {};
for (var i=0; i < array.length; i++) {
 /* obj[array[i]] = +=1 */ <= pseudo code
}

如何创建这个频率计数器对象?

【问题讨论】:

    标签: javascript arrays dictionary


    【解决方案1】:

    关闭但你不能增加 undefined 所以你需要设置初始值如果它不存在

    var array = [1,4,4,5,5,7];
    var obj = {};
    for (var i=0; i < array.length; i++) {
      obj[array[i]] = (obj[array[i]] || 0) +1 ;
    }
    

    【讨论】:

    • 所以在第一次向对象添加新值时,||0 会被执行,并且每次后续时间都会执行 obj[array[i]] + 1
    【解决方案2】:

    你快到了。见以下代码:

    var array = [1,4,4,5,5,7];
    var obj = {};
    for (var i=0; i < array.length; i++) {
     obj[array[i]] = (obj[array[i]] || 0 ) +1;
    }
    console.log(obj);

    【讨论】:

      【解决方案3】:

      创建一个对象并检查该特定键是否存在。如果存在则将其值增加 1

      var array = [1, 4, 4, 5, 5, 7];
      var obj = {};
      for (var i = 0; i < array.length; i++) {
        if (obj.hasOwnProperty(array[i])) {
          obj[array[i]] += 1;
      
      
        } else {
          obj[array[i]] = 1;
        }
      }
      
      console.log(obj)

      【讨论】:

        【解决方案4】:

        您可以使用? : 三元运算符将初始值设置为1,然后在后续匹配时将其递增。

        var array = [1,4,4,5,5,7];
        var obj = {};
        for (var i=0; i < array.length; i++) {
          obj[array[i]] = obj[array[i]]?obj[array[i]]+1:1;
        }
        console.log(obj);

        【讨论】:

          【解决方案5】:

          如果数组总是相同的,并且您要检查同一数组中多个项目的频率而不对其进行修改,@JohanP 的答案很好。

          但是如果你只检查一个项目的频率,或者数组可以改变,那么创建对象只不过是额外的开销。

          在这种情况下,您可以这样做:

          const getItemFrequency = function(array, item) {
            return array.filter(i => i === item).length;
          }
          
          var array = [1,4,4,5,5,7];
          console.log(getItemFrequency(array, 4));

          【讨论】:

            【解决方案6】:

            简洁的逻辑写成正确的函数:

            function countArrayItemFrequecy(array) {
              const length = array.length;
              const map = {};
              for ( let i = 0; i < length; i++ ) {
                let currentItem = array[i];
                if (typeof map[currentItem] !== 'undefined' ) {
                  map[currentItem]++
                } else {
                  map[currentItem] = 1
                }
              }
              return map;
            }
            

            【讨论】:

              【解决方案7】:

              您需要确保为第一次出现该项目的频率对象分配默认值。作为快捷方式,您可以使用三元运算符

              var array = [1,4,4,5,5,7];
              var obj = {};
              for (var i=0; i < array.length; i++) {
               obj[array[i]] = obj[array[i]] ? obj[array[i]]++ : 1;
              } 
              

              等同于:

              var array = [1,4,4,5,5,7];
              var obj = {};
              for (var i=0; i < array.length; i++) {
               if (obj[array[i]]) {
                   obj[array[i]]++;
               } else {
                 obj[array[i]] = 1;
               }
              } 
              

              【讨论】:

                【解决方案8】:

                您可以使用Object.assign:在下面克隆map,然后递增/添加计数器。这些是纯粹的(没有副作用/参数重新分配)、单一用途的函数。

                addToMap{ ...map, map[e]: [e]: (map[e] || 0) + 1 } 做同样的事情,但这需要 babel。

                const addToMap = (map, e) => Object.assign({}, map, { [e]: (map[e] || 0) + 1 });
                const buildMap = a => a.reduce(addToMap, {});
                

                【讨论】:

                  猜你喜欢
                  • 2017-09-26
                  • 2020-01-20
                  • 1970-01-01
                  • 2015-09-26
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-09-21
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多