【问题标题】:How to increment a value in a JavaScript object?如何增加 JavaScript 对象中的值?
【发布时间】:2016-09-20 09:47:12
【问题描述】:
var map = {};
map[key] = value;

我该怎么做

  • 如果对象中尚不存在键,则赋值 1
  • 如果存在则将值加 1

我能做得更好吗:

if (map[key] == null) map[key] = 0;
map[key] = map[key]++;

【问题讨论】:

  • 尝试 if (typeof map [key] === "undefined") 检查不存在。通常,地图中不存在的东西将是未定义的。不为空。
  • 你不能用hasOwnProperty来检查你要找的道具是否存在吗?

标签: javascript


【解决方案1】:

在这里你可以最小化你的代码。

map[key] = (map[key]+1) || 1 ;

【讨论】:

  • “升旗”是指“短路评估”。这与升旗无关,尽管“升旗”是一种有趣的混搭。
  • 在 JavaScript 中没有标志提升属性。您不能使用所谓的“短路评估”。最终,它使用了相同的概念。
  • 您的代码中根本没有涉及任何提升。
  • 你误读了这个问题。 var a = a || 1; 将涉及提升,因为 var 关键字(局部变量被提升)。在这里,您正在操作现有对象的属性,因此没有任何东西会在任何地方被提升。
  • @ricky:不。通过不存在的键获取值返回undefined(没有任何不可见的赋值)。 undefined + 1 给出了 NaN,这是一个虚假值,因此控制转到 || 1 部分。我向你保证,这里没有悬挂任何东西。去阅读这个术语。
【解决方案2】:

最近可能是

map[key] = (map[key] ?? 0) + 1;

Nullish coalescing operator

【讨论】:

    【解决方案3】:

    您可以检查对象是否没有特定键并设置它或将现有键值加一:

    function assignKey(obj, key) {
      typeof obj[key] === 'undefined' ? obj[key] = 1 : obj[key]++;
    }
    
    var map = {};
    
    assignKey(map, 2);
    assignKey(map, 2);
    assignKey(map, 4);
    assignKey(map, 1);
    assignKey(map, 2);
    assignKey(map, 5);
    assignKey(map, 1);
    console.log(map);

    【讨论】:

      【解决方案4】:

      ES6 为地图提供了一个专用类Map。您可以轻松扩展它以构造“具有默认值的地图”:

      class DefaultMap extends Map {
      
          constructor(defVal, iterable=[]) {
              super(iterable);
              this.defVal = defVal;
          }
      
          get(key) {
              if(!this.has(key))
                  this.set(key, this.defVal);
              return super.get(key);
          }
      }
      
      m = new DefaultMap(9);
      console.log(m.get('foo'));
      m.set('foo', m.get('foo') + 1);
      console.log(m.get('foo'))

      (Ab)将对象用作地图有几个缺点,需要谨慎。

      【讨论】:

      • 代码sn-p有错误; Uncaught SecurityError。我不确定这是代码本身的问题还是某些 StackOverflow 问题。只是想我会指出来。
      【解决方案5】:

      你可以像这样使用三元运算符

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

      【讨论】:

        【解决方案6】:

        如果将数组的值转换为整数并递增它会更好。这将是健壮的代码。 默认情况下,数组的值为字符串。因此,如果您不将其转换为整数,则它可能无法跨浏览器工作。

        if (map[key] == null) map[key] = 0;
        map[key] = parseInt(map[key])+1;
        

        【讨论】:

        • parseInt(undefined) 是 NaN。
        • 你是否也声明了 key 的值?
        • 另外,“默认数组的值为字符串”只是垃圾,问题中没有数组。
        【解决方案7】:
        function addToMap(map, key, value) {
            if (map.has(key)) {       
                map.set(key, parseInt(map.get(key), 10) + parseInt(value, 10));
            } else {
                map.set(key, parseInt(value, 10));
            }       
        }
        

        【讨论】:

          【解决方案8】:

          创建一个对象:

              tagObject = {};
              tagObject['contentID'] = [];  // adding an entry to the above tagObject
              tagObject['contentTypes'] = []; // same explanation as above
              tagObject['html'] = [];
          

          现在下面是我添加到上述标签对象中的出现条目..

          ES 2015 标准: function () {}() => {} 相同

                    let found = Object.keys(tagObject).find(
                          (element) => {
                              return element === matchWithYourValueHere;
                          });
          
                    tagObject['occurrences'] = found ? tagObject['occurrences'] + 1 : 1;
          

          这将增加特定对象键的计数..

          【讨论】:

            【解决方案9】:

            最短的代码是:

            map[key] = ++map[key] || 1

            【讨论】:

              猜你喜欢
              • 2021-05-06
              • 2021-06-04
              • 1970-01-01
              • 1970-01-01
              • 2013-10-08
              • 1970-01-01
              • 2017-11-26
              • 1970-01-01
              • 2014-03-21
              相关资源
              最近更新 更多