当我在另一个数组上调用 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)})
你也可以制作自己的函数。
我知道这是一个奇怪的事件和问题,但我遇到了一个问题,我有两个对象数组“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)})
你也可以制作自己的函数。