我知道这是一个很奇怪的问题,但是,我创建了一个防止数组中重复值的保护程序,我写了一部分,并从stackoverflow得到了一些帮助,但我无法正确理解代码的含义
所以我用null
原型创建了对象,并对其进行迭代以检测重复值(我知道Set构造函数要容易得多,但是我在服务器端代码中做到了这一点,并且由于较旧的浏览器不支持Set(使用Set)是危险的。这是我的代码
var duplicateTagsGuard = Object.create(null);
for(var co = 0; co < tags.length; co++){
let val = tags[co];
if(val in duplicateTagsGuard){
return res.status(409).send({
message: ''
})
}
duplicateTagsGuard[val] = true
}
我无法理解的部分是duplicateTagsGuard[val] = true
因此,如果我们逐步拆分代码并进行解释,就像
1。首先创建空对象
2.iterate for循环并声明变量val
,使其等于标签数组中的每个元素
3。然后检查val
是否在plicateTagsGuard对象中,是否使用return语句防止继续进行for循环,如果不是,则将val
的值添加到对象中,但是如果有人能解释我会很高兴,我不知道如何用那部分代码(duplicateTagsGuard[val] = true
)来实现它
答案 0 :(得分:0)
代码正在创建val
的字典。基本上,当您遍历tags
数组时,它将检查字典tags[co]
中是否已经存在该数组中的项目(由duplicateTagsGuard
访问)。如果以前遇到过,它将执行某些操作。
在循环结束时,它只是将项目插入字典中。因此,词典会跟踪在for
循环中是否曾经遇到过某个项目。
通过使用该项作为字典中的键来完成注入,因为查找起来更容易(您只需要做item in dictionary
,这在实际实现中基本上是val in duplicateTagsGuard
代码)。使用什么值都没有关系,因此将true
值用作占位符。
答案 1 :(得分:0)
首先创建空对象
它是 不创建 null
对象,但是它是使用null
作为 prototype < / em> 检查Object.create
文档:
var duplicateTagsGuard = Object.create(null);
console.log(`duplicateTagsGuard is an empty object:`);
console.log(duplicateTagsGuard);
console.log(`Prototye of duplicateTagsGuard is null: `);
console.log(Object.getPrototypeOf(duplicateTagsGuard));
对其进行迭代并声明变量val,使其等于标签数组中的每个元素
每次循环运行时,此部分都是正确的,将使用for块范围创建一个新变量,并为其分配{{1}的当前co
th 索引值的值}数组。
然后检查val是否在plicateTagsGuard对象中,以及是否使用return语句来防止继续进行for循环,如果不是,那么我们将val的值添加到对象中,但是我不知道如何用该部分实现它代码(duplicateTagsGuard [val] = true)
正在检查tags
是否是val
对象的属性,如果已经存在,则使用return返回响应,否则将其添加到{{1} }对象与bracket notation duplicateTagsGuard
并将其值分配为duplicateTagsGuard
。
[propertyName]