繁体   English   中英

有人可以解释循环过程向对象添加新属性吗?

[英]Could someone please explain the looping process to add new properties to an object?

我对编程很新,所以请原谅我是这样一个菜鸟。 任何输入都非常感谢。 挑战要求在数组中找到模式。 这是代码:

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,1,5,5,7,10,3,3,3,3]的数组,它会产生{'1':2, '3':4, '5':2, '7':1, '10':1}的对象{'1':2, '3':4, '5':2, '7':1, '10':1} 它下面的代码( for(e in c) )我明白了。 函数基本上返回的模式是3.我困惑的是以下代码:

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

此代码负责创建以下对象:

{'1':2, '3':4, '5':2, '7':1, '10':1}

有人可以解释它是如何做到的吗? 它如何制作对象列表并保留每个对象名称的计数? 我很困惑。

var a = b || c; 是JavaScript中常见的习语。 这意味着:

  1. 如果b值,则a将接收b
  2. 如果b值,则a将接收c

(查找“的JavaScript truthy和falsy值”来理解这一点。基本上有在JavaScript 6件事情是falsy的,别的都是truthy)。

这基本上是计算出事物的数量。

如果没有为c[arr[i]]分配值,则它将是undefined 由于undefined ,表达式(c[arr[i]] || 0)将导致0 ,因为undefined是一个值。 然后, 0 + 1导致1 c[arr[i]]现在是1

另一方面,如果为c[arr[i]]分配了一个值,则(c[arr[i]] || 0)将得到相同的值(例如, 1 )。 所以(c[arr[i]] || 0)则为1 ,因为c[arr[i]]11 || 0 1 || 0将导致1 ,因为1值。 然后你有1 + 1c[arr[i]]现在是2

你在计算某事的出现次数。 你从0开始,然后是1 ,然后是2

如果你把它分解,它会像下面那样:

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;
  }
}

你可以坚持下去:

if (!c[a]) {
  c[a] = 1
} else {
  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

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

  • 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]]是一个假值 (如falseundefined0""等),那么设置c[arr[i]]到0“。 如果它是一个真值(如true3"string" ),则c[arr[i]]将被设置为自身 - 换句话说,它不会改变。 如果是||的左侧 是真的, c[arr[i]]设置为,否则,它设置在||的右侧 ,在这种情况下为0 以下是这些逻辑运算符如何工作的参考。
  • +1 :无论评估的是什么(c[arr[i]] || 0) ,现在将c[arr[i]]任何内容加1。

如果您正在使用ES6 / ES2015 /无论他们现在称之为什么, Map都可以解决这些问题:

 function findMode(arr) { let c = new Map(); arr.forEach(elem => { c.set(elem, (c.get(elem) || 0) + 1); }); let mode, max = 0; for (let [key, value] of c) { if (value > max) { mode = key; max = value; } } return mode; } findMode([1, 1, 5, 5, 7, 10, 3, 3, 3, 3]); // -> 3 

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 || 0基本上意味着如果c[arr[i]]是一个类似于“ null ”的值,在JS null中,则使用0而不是null 这解决了我们以前没有见过这个数字的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM