【问题标题】:Why does two equal Objects shows 'not equal" in Angular 2为什么两个相等的对象在Angular 2中显示“不相等”
【发布时间】:2016-06-13 08:46:36
【问题描述】:

我从 json 文件上传数组。 每 1.5 秒我检查文件中是否有任何更改(目前我在一个文件上测试没有任何更改),但是当我检查是否

    if ( this.itemsParentArray[i] !== this.itemInArray[i] )

总是显示不相等,console.log(""not equal")

我是否遗漏了代码中的某些内容??这里是:

export class HomeComponent {
itemsParentArray = [];
itemInArray = [];
myRes: Content;
showAssigned:boolean = false;

constructor(private structureRequest: StructureRequestService) {
    setInterval(() => {
        this.timerGetStructure();
    }, 1500);
}
//  using with setInterval to get new data and sets into content Array with this.updateItems(result) if it's new

timerGetStructure() {
    this.structureRequest.sendRequest().subscribe((result) => this.updateItems(result));
}
updateItems(result) {
    this.myRes =  result;
    this.itemInArray = this.myRes.content;
    for ( let i = 0; i < this.itemInArray.length; i++) {
                if ( this.itemsParentArray[i] !== this.itemInArray[i] ) {
                   // this.itemsParentArray[i] = this.itemInArray[i];
                   console.log("not equal");
                }
            }
}

//
ngOnInit() {
    //makes http request and puts result into parentArray after 3 sec.
    this.structureRequest.sendRequest().subscribe((result) => this.viewNodes(result));
}
//view items
viewNodes(result) {
    setTimeout(() => {
        this.myRes =  result;
        this.itemsParentArray = this.myRes.content;
        this.showAssigned = true;
    }, 3000);
}
}

如您所见,它从同一个文件加载数据(我不更改文件数据!!!):

this.itemsParentArray = this.myRes.content;

并且(每 1.5 秒):

this.itemInArray = this.myRes.content;

【问题讨论】:

    标签: angular


    【解决方案1】:

    == 尤其是=== 不检查对象是否包含具有相同值的相同属性。它只是检查它是否是同一个对象引用。

    {} == {} 
    

    {} === {}
    

    也会导致false

    另请参阅Typescript: Avoid comparison by referenceHow do I initialize a typescript object with a JSON object

    Plunker example

    【讨论】:

      【解决方案2】:

      对于我比较 Angular 2/4 中的两个对象,我尝试了下面的代码。这完全有效。

      JSON.stringify(obj1) === JSON.stringify(obj2);

      【讨论】:

        【解决方案3】:

        我在 TypeScript 中编写了这个辅助函数:

        export class Helper {
            private _recursiveProperties: string[] = ['RecursiveProperty', ...];
        
            public equals(obj1: any, obj2: any): boolean {
                if (typeof obj1 !== typeof obj2) {
                    return false;
                }
                if ((obj1 === undefined && obj2 !== undefined) ||
                    (obj2 === undefined && obj1 !== undefined) ||
                    (obj1 === null && obj2 !== null) ||
                    (obj2 === null && obj1 !== null)) {
                    return false;
                }
                if (typeof obj1 === 'object') {
                    if (Array.isArray(obj1)) {
                        if (!Array.isArray(obj2) || obj1.length !== obj2.length) {
                            return false;
                        }
                        for (let i = 0; i < obj1.length; i++) {
                            if (!this.equals(obj1[i], obj2[i])) {
                                return false;
                            }
                        }
                    } else {
                        for (let prop in obj1) {
                            if (obj1.hasOwnProperty(prop)) {
                                if (!obj2.hasOwnProperty(prop)) {
                                    return false;
                                }
                                //Endless loop fix for recursive properties
                                if (this._recursiveProperties.indexOf(prop) >= 0) {
                                    if (obj1[prop] !== obj2[prop]) {
                                        return false;
                                    }
                                } else if (!this.equals(obj1[prop], obj2[prop])) {
                                    return false;
                                }
                            }
                        }
                        for (let prop in obj2) {
                            if (obj2.hasOwnProperty(prop)) {
                                if (!obj1.hasOwnProperty(prop)) {
                                    return false;
                                }
                            }
                        }
                    }
                    return true;
                }
                return obj1 === obj2;
            }
        }
        

        其中_recursiveProperties 包含导致无限循环的(如果有的话)属性的名称。例如。我有一个对象(obj1),它的属性包含对另一个对象(obj2)的引用,而另一个对象(obj2)又包含对obj1的引用。

        如果有人有更好的解决方案,请发表评论。

        然后用法是:

        let helper = new Helper();
        if (helper.equals(this.itemsParentArray[i], this.itemInArray[i]))
        

        【讨论】:

        • 递归属性问题的解决方案是保留已访问属性的列表,并且仅在访问新属性时递归。
        猜你喜欢
        • 1970-01-01
        • 2023-01-26
        • 2021-07-05
        • 2014-05-04
        • 2013-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多