当我在另一个数组上调用 shift 时,一个数组被修改

An array is modified when i call shift on another array

我知道这是一个奇怪的事件和问题,但我遇到了一个问题,我有两个对象数组“Reponses”和“Questions”。在我的程序中的某个时刻,我通过使用 shift() 删除了“问题”中对象的第一个元素,并且以相同的方式修改了第二个数组“响应”,我从不在其上调用 shift()。这是代码:

private async Sousstep(stepContext: WaterfallStepContext): Promise<DialogTurnResult> {
    const siteDetails = stepContext.options as SiteDetails;
    
    //  IF OUI ----- IF NON ------ 
    if (Questions[0].sousquestions.length === 1 && Questions.length === 1) { siteDetails.skip = true; return await stepContext.next('next'); }
    if (!siteDetails.exit && !siteDetails.skip) {
         Reponses[0].sousquestions[0]
        const switchvar = Questions[0]
        const id = Questions[0].sousquestions[0].id
       
        if (Questions[0].sousquestions.length > 1) { siteDetails.skip = true; Questions[0].sousquestions.shift() } else {

            siteDetails.sousquestion = false;

            if (Questions.length > 1) { Questions.shift(); siteDetails.skip = true; return await stepContext.replaceDialog(WATERFALL_DIALOG, siteDetails) }
        }
        
        if (stepContext.result.value === 'Oui') {                     // CONTINUE ICI SI OUI ALORS ON EFFECTUE ON PROMPTE L4UTILISATEUR POUR SOIT NUMBER OU BOOLEAN OU STRING
            siteDetails.skip = false;

            switch (switchvar.sousquestions[0].type) {
                case 'number':
                    return await stepContext.prompt(NUMBER_PROMPT, { prompt: `Saisissez le degré D'intensité de 0 à 9 , Pendant le mois avant avoir eu le Covid" ?` });
                    break;
                case 'boolean':
                  
                    let elementPos = Reponses.map(function (x) { return x.id; }).indexOf(Questions[0].id);
                   
                    let souselementPos = Reponses[elementPos].sousquestions.map(function (x) { return x.id; }).indexOf(id);
                    console.log(Reponses[elementPos].sousquestions)
                   
                    Reponses[elementPos].sousquestions[souselementPos].reponse = true;
                   
                    siteDetails.skip = true 
                    return await stepContext.replaceDialog(WATERFALL_DIALOG, siteDetails);
                    break;
                case 'string':

                    return await stepContext.prompt(TEXT_PROMPT, { prompt: ` Donnez le nom ou pseudo de votre Signe Général ` });

                    break;
                
                default:
                    
                    break;
            }
        }
        else { if (typeof stepContext.result === 'number') {
                    let elementPos = Reponses.map(function (x) { return x.id; }).indexOf(Questions[0].id);
                    let souselementPos = Reponses[elementPos].sousquestions.map(function (x) { return x.id; }).indexOf(Questions[0].sousquestions[0].id);
                    Reponses[elementPos].sousquestions[souselementPos].value = stepContext.result;
                    console.log(Reponses[elementPos].sousquestions)

                    return await stepContext.replaceDialog(WATERFALL_DIALOG, siteDetails);
        } else {
            
         siteDetails.skip = true; return await stepContext.replaceDialog(WATERFALL_DIALOG, siteDetails);} }


    } else {

        return await stepContext.next(null);
    }
}
DB.query().then((res) => { Questions = res; Reponses = res ; 
console.log(Reponses[0].sousquestions)})

使用上面的代码,Questions 和 Responses 都将指向内存中的同一个地址。改变一个就会改变另一个。


DB.query().then((res) => { Questions = JSON.parse(JSON.stringify(res)); 
Reponses = JSON.parse(JSON.stringify(res)) ; console.log(Reponses[0].sousquestions)})

这种基于 JSON 的方法将创建新实例,您不会修改同一个数组。他们有点慢。此外,如果您的数组对象具有其他函数和符号作为 属性,这将不是最佳解决方案(它们不是有效的 JSON 值)。

如果你想使用一个模块,你可以使用 lodash。导入并使用

DB.query().then((res) => { Questions = _.clondeDeep(res); 
Reponses = _.clondeDeep(res); console.log(Reponses[0].sousquestions)})

你也可以制作自己的函数。