[英]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中常见的习语。 这意味着:
b
是真值,则a
将接收b
。 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]]
是1
和1 || 0
1 || 0
将导致1
,因为1
是真值。 然后你有1 + 1
而c[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]]
是一个假值 (如false
, undefined
, 0
, ""
等),那么设置c[arr[i]]
到0“。 如果它是一个真值(如true
, 3
, "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.