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]
是一个类似于JSnull
的“假”值,那么使用0
而不是null
。这就解决了我们以前没有见过这个数字的情况是JavaScript中常见的习惯用法。这意味着:
b
是真实值,a
将接收b
b
是错误值,a
将接收c
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
,然后将”
设置为0”。如果它是一个真实值(比如c[arr[i]
,true
,3
),那么“string”
将被设置为自身-换句话说,它不会改变。如果c[arr[i]
的左侧是真实的,|
被设置为该值,否则,它被设置为c[arr[i]
的右侧,在本例中为|
李>0
:无论计算的是什么+1
,现在将1添加到(c[arr[i]| | 0)
中的任何内容c[arr[i]]
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