我正在尝试使用 IOperation 界面进行一些操作。但是我有一个奇怪的错误。 当我记录操作值或操作结果时,没有问题,但是当我尝试记录接口本身时,我将覆盖操作值和结果。
我的代码在这里:https://stackblitz.com/edit/angular-flpdu1?embed=1&file=src/app/app.component.ts
//app/app.component.ts
import { Component } from '@angular/core';
import { IOperation } from './definitions/operation';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
operations: {
[operationName: string]: IOperation
}[] = [];
columns: {
columnName: string,
columnOperations: IOperation[]
}[] = [];
constructor() {
let sum: IOperation = {
operationName: "sum",
operationFunction: this.sumFunction
};
let avg: IOperation = {
operationName: "avg",
operationFunction: this.avgFunction
};
this.operations["sum"] = sum;
this.operations["avg"] = avg;
this.columns = [
{
columnName: "column1",
columnOperations: [this.operations["sum"]]
},
{
columnName: "column2",
columnOperations: [this.operations["avg"]]
},
{
columnName: "column3",
columnOperations: []
},
{
columnName: "column4",
columnOperations: [this.operations["sum"], this.operations["avg"]]
},
{
columnName: "column5",
columnOperations: []
}
];
this.doOperation();
}
sumFunction(values: number[]): number {
let result: number = 0;
values.forEach((i: number) => {
result += i;
});
return result;
}
avgFunction(values: number[]): number {
let result: number = 0;
values.forEach((i: number) => {
result += i;
});
return result / values.length;
}
doOperation(): void {
let values: number[][] = [
[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10],
[11, 12, 13, 14, 15],
[16, 17, 18, 19, 10],
[21, 22, 23, 24, 25],
[26, 27, 28, 29, 20],
[31, 32, 33, 34, 35]
];
for (let i = 0; i < this.columns.length; i++) {
for (let k = 0; k < this.columns[i].columnOperations.length; k++) {
console.log(i+","+k);
let gc: number[] = [];
let gcOperation:IOperation=this.columns[i].columnOperations[k];
for (let j = 0; j < values.length; j++) { gc.push(values[j][i]); }
gcOperation.operationValues = gc;
gcOperation.operationResult = gcOperation.operationFunction(gcOperation.operationValues);
console.log("correct answer:"+gcOperation.operationResult);//correct answer
console.log(gcOperation);
//gcOperation.operationResult is wrong here
}
}
}
}
// /definitions/operation.ts
export interface IOperation {
operationName: string,
operationFunction?: Function,
operationValues?: any[],
operationResult?: any
}
正如您在控制台中看到的,我登录了 operation.operationResult ,它是正确的。然后我立即记录相同的“操作”,并且它的 operationResult 错误。
我正在使用opera 54.0
和chrome 68.0
。
如果您没有相同的问题(如果仅是我的计算机)
(很抱歉,如果我违反网站的任何规定,这是我的第一个问题,我的英语水平也不是很好。谢谢大家想要帮助我。)
答案 0 :(得分:0)
在代码执行期间,operationResult的值可能会更改。有时是112,后来是133。
由于您正在记录一个对象引用(不是深层副本),因此在将对象记录到控制台时,这种奇怪的行为很容易发生。 虽然顶部的对象表示形式是您记录时的快照快照,但“打开”对象后的值却是当前值。
您可能希望记录对象的深层副本以验证我的假设(例如,通过使用lodash / jquery的相应功能)