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}]
then
b.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
writable
console.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);
});