Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有人能解释一下向对象添加新属性的循环过程吗?_Javascript_Arrays_Object_For Loop - Fatal编程技术网

Javascript 有人能解释一下向对象添加新属性的循环过程吗?

Javascript 有人能解释一下向对象添加新属性的循环过程吗?,javascript,arrays,object,for-loop,Javascript,Arrays,Object,For Loop,我对编程很陌生,所以请原谅我是个新手。非常感谢您的任何意见。挑战要求在数字数组中找到模式。代码如下: function findMode(arr) { var c = {}; for (var i = 0; i < arr.length; i++) { c[arr[i]] = (c[arr[i]] || 0) + 1; } var mode; var max = 0; for (var e in c) { if (c[e] > max) {

我对编程很陌生,所以请原谅我是个新手。非常感谢您的任何意见。挑战要求在数字数组中找到模式。代码如下:

function findMode(arr) {
  var c = {};
  for (var i = 0; i < arr.length; i++) {
    c[arr[i]] = (c[arr[i]] || 0) + 1;
  }
  var mode;
  var max = 0;
  for (var e in c) {
    if (c[e] > max) {
      mode = e;
      max = c[e];
    }
  }
  return mode * 1;
}
此代码负责创建以下对象:

{'1':2, '3':4, '5':2, '7':1, '10':1}
有人能解释一下它是怎么做到的吗?它如何制作对象列表并记录每个对象名称?我被它弄糊涂了

c[arr[i]] = (c[arr[i]] || 0) + 1;
逐件:

c
是对象的名称,您可以使用
[]
来访问对象的内部属性,而不是您可能熟悉的JS对象中的常规
语法

arr
是答案中的给定数组
i
是for循环中的索引
arr[i]
是列表中的一个数字(例如1)

c[arr[i]]
表示与对象
c
中的键
arr[i]
关联的值。有一个
=
符号,因此我们将为该值赋值

c[arr[i]]
也位于等号的另一侧,因此我们正在读取该值

然后我们再加上一个


| | 0
基本上意味着如果
c[arr[i]
是一个类似于JS
null
的“假”值,那么使用
0
而不是
null
。这就解决了我们以前没有见过这个数字的情况是JavaScript中常见的习惯用法。这意味着:

  • 如果
    b
    是真实值,
    a
    将接收
    b
  • 如果
    b
    是错误值,
    a
    将接收
    c
  • (查阅“JavaScript truthy和falsy值”来理解这一点。JavaScript中基本上有6种东西是虚假的。其他所有东西都是真实的)

    这基本上是计算某件事发生的次数

    如果没有为
    c[arr[i]]
    分配值,则它将是
    未定义的
    。如果
    未定义
    ,表达式
    (c[arr[i]]| | 0)
    将导致
    0
    ,因为
    未定义
    是错误的值。然后,
    0+1
    产生
    1
    c[arr[i]
    现在是
    1

    另一方面,如果为
    c[arr[i]]
    分配了一个值,那么
    (c[arr[i]]| | 0)
    将产生相同的值(例如,
    1
    )。因此
    (c[arr[i]]| | 0)
    就是
    1
    ,因为
    c[arr[i]
    就是
    1
    1 | | 0
    会导致
    1
    ,因为
    1
    是真实值。然后是
    1+1
    c[arr[i]
    现在是
    2


    你在计算某件事的发生次数。您从
    0
    开始,然后是
    1
    ,然后是
    2

    让我们将代码片段分解为各个部分:

    • c[arr[i]]
      :此代码执行与使用点符号相同的操作(如
      arr.length
      )。它指的是对象中的一个位置-在本例中,是
      arr
      中的一个元素。例如,如果
      arr=[3,6,8]
      ,并且您说
      c[arr[0]]
      ,您试图将此添加到对象:
      3:…
      。对于
      c[arr[1]]
      ,您将尝试添加
      6:…
      等等。我们必须使用括号,因为我们不知道在
      arr[i]
      上是什么
    • =
      :我希望你知道它的作用
    • (c[arr[i]| | 0)
      :这是说,“如果
      c[arr[i]
      是一个(比如
      false
      未定义的
      0
      ,然后将
      c[arr[i]
      设置为0”。如果它是一个真实值(比如
      true
      3
      “string”
      ),那么
      c[arr[i]
      将被设置为自身-换句话说,它不会改变。如果
      |
      的左侧是真实的,
      c[arr[i]
      被设置为该值,否则,它被设置为
      |
      的右侧,在本例中为
      0
    • +1
      :无论计算的是什么
      (c[arr[i]| | 0)
      ,现在将1添加到
      c[arr[i]]
      中的任何内容
    如果您喜欢ES6/ES2015/不管他们现在叫它什么,
    Map
    非常适合这些类型的问题:

    函数findMode(arr){
    设c=newmap();
    arr.forEach(elem=>{
    c、 集合(elem,(c.get(elem)| | 0)+1);
    });
    let模式,最大值=0;
    for(让[key,value]为c){
    如果(值>最大值){
    模式=键;
    最大值=最大值;
    }
    }
    返回模式;
    }
    
    findMode([1,1,5,5,7,10,3,3,3]);//->3
    如果您将其分解,其作用与:

    var c = {};
    for (var i = 0; i < arr.length; i++) {
      var a = arr[i];
      // count item for the first time
      if (c[a] === undefined) {
        c[a] = 1;
      // increment count
      } else {
        c[a] = c[a] + 1;
      }
    }
    
    还有更多:

    c[a] = c[a] ? (c[a] + 1) : 1
    
    直到你得到:

    c[a] = (c[a] + 1) || 1 // OR passes because NaN (hacky)
    
    也可以表示为:

    c[a] = (c[a] || 0) + 1
    

    仅供参考,只有当您的示例生成任何可见的输出时,使用代码段才有意义。@FelixKlingThank,我的朋友。正如您所知,我对编程和stackoverflow非常陌生:)非常感谢您的详细回答。有了你的解释,我完全明白了。
    c[a] = (c[a] + 1) || 1 // OR passes because NaN (hacky)
    
    c[a] = (c[a] || 0) + 1