Javascript-将两个属性设置为相同的值-控制台日志显示它们具有不同的值
我在一个文档数组中循环,并将两个属性设置为相同的值,但是,执行Javascript-将两个属性设置为相同的值-控制台日志显示它们具有不同的值,javascript,typescript,Javascript,Typescript,我在一个文档数组中循环,并将两个属性设置为相同的值,但是,执行控制台。log显示这两个属性具有不同的值 代码: 当代码将两个属性都设置为true时,控制台记录整个数组时会显示无论发生什么情况,canUpload始终为false,如果代码进入true块,则upper为true。是什么导致了这种奇怪的行为?我使用array.map()和一些其他形式的循环尝试了它,所有这些都得到了相同的结果。forEach语句应该可以正常工作。我试图用一些虚拟数据调用它,在所有情况下我都得到了预期的行为。您是否尝试在
控制台。log
显示这两个属性具有不同的值
代码:
当代码将两个属性都设置为
true
时,控制台记录整个数组时会显示无论发生什么情况,canUpload
始终为false,如果代码进入true
块,则upper
为true。是什么导致了这种奇怪的行为?我使用array.map()
和一些其他形式的循环尝试了它,所有这些都得到了相同的结果。forEach语句应该可以正常工作。我试图用一些虚拟数据调用它,在所有情况下我都得到了预期的行为。您是否尝试在forEach语句中记录每个元素?如果是这样的话,问题会重现吗?元素是否如预期的那样?
另外,reload函数的作用是什么?Array.foreach只是在数组中运行,并不更改数组的值。Array.map在整个数组中运行,并返回一个新数组,但不会更改数组本身。您需要手动分配或重写变量。 这是我的建议
this.logicItem.$promise.then(() => {
this.logicItem.getDocuments().$promise.then((docs: any) => {
//changed from forEach to map
docs = docs.map( element => {
if (element.buildProgrammeActivityStatus === BUILD_PROGRAMME_ACTIVITY_STATUS.Confirmed ||
element.buildProgrammeActivityStatus === BUILD_PROGRAMME_ACTIVITY_STATUS.Complete) {
element.upper = true;
element.canUpload = true;
} else {
element.upper = false;
element.canUpload = false;
}
//Added a return element
return element.
});
console.log(docs);
});
this.logicItem.reload(true);
});
我试过你的答案,结果也一样。另外,
array.forEach
会更改upper
的值。控制台.log显示了这种奇怪的行为。最后尝试使用1表示真,0表示假。这可能没有什么帮助,但在Array.forEach和Array.map上则相反<代码>设b=[1,2,3,4,5];b、 forEach(b=>b*2);b Result=[1,2,3,4,5]b.map(b=>b*2)[2,4,6,8,10];结果b=[1,2,3,4,5];b=b.map(b=>b*2)结果b=[2,4,6,8,10]将canUpload更改为1和0无效。你给出的例子在我测试时是正确的。但这也是正确的:b=[{a:true,b:true},{a:true,b:true}]
thenb.forEach(x=>{x.a=false;x.b=false})代码>然后是console.log(b);is[{a:false,b:false},{a:false,b:false}]
通过foreach更改对象的属性是正确的。感谢heads up.Console.logging元素
在将两个属性设置为true
后直接显示canUpload
为false,而upper
为true。我认为代码很好,因此不会在沙箱中重现此错误。我更多的是问我应该调查什么。我认为我的canUpload
属性必须是readOnly
或其他什么。函数前面是否定义了canUpload
和upper
字段?如果是的话,两者都是假的?我还将尝试在循环中将canUpload
的值更改为true,以确认该值没有更改(可能也在外部)。upper
最初未定义,但canUpload
最初为false<代码>单据[0]。canUpload=true;console.log(文档)
显示它仍然是false
代码>返回?(更具体地说,请尝试将值存储在变量const elementDescriptor=getOwnPropertyDescriptor(元素'canUpload');
中,然后记录elementDescriptor.writable
属性)如果writable为false,这就是无法工作的原因。因此,在这种情况下,您还需要检查可配置属性(您可以只记录getOwnPropertyDescriptor(元素'canUpload');因为它有4个属性)。如果可配置和可写属性均为false,则根据,如果可配置属性为false,则您只能将可写属性从true更改为false(以及任何其他属性,包括可配置属性),即canUpload
writableconsole.log(Object.getOwnPropertyDescriptor(element,'canUpload')| | Object.getOwnPropertyDescriptor(Object.getPrototypeOf(element,'canUpload'))
@AuxTaco谢谢。控制台日志显示{value:true,writable:true,enumable:true,configurable:true}
。看起来它是可写的。很奇怪,它当时没有改变值。
this.logicItem.$promise.then(() => {
this.logicItem.getDocuments().$promise.then((docs: any) => {
//changed from forEach to map
docs = docs.map( element => {
if (element.buildProgrammeActivityStatus === BUILD_PROGRAMME_ACTIVITY_STATUS.Confirmed ||
element.buildProgrammeActivityStatus === BUILD_PROGRAMME_ACTIVITY_STATUS.Complete) {
element.upper = true;
element.canUpload = true;
} else {
element.upper = false;
element.canUpload = false;
}
//Added a return element
return element.
});
console.log(docs);
});
this.logicItem.reload(true);
});