2016-06-13 48 views
6

I從json文件中上傳數組 每1.5秒我檢查文件是否有任何變化(此刻我在一個文件上測試沒有任何變化),但是當我檢查,如果爲什麼在Angular 2中兩個相等的對象顯示'不相等'

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

它總是顯示,這不是平等的,執行console.log(「」不等於「)

難道我錯過了在代碼的東西?那就是:

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; 

回答

2

我寫了打字稿這個輔助功能:

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)的引用,該對象又包含對obj1的引用。

如果有人有更好的解決方案,請發表評論。然後

用法是:

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

對遞歸屬性問題的解決方案是保留訪問屬性的列表,並且只在訪問新屬性時進行遞歸。 – N8allan

1

對我來說,在角2/4比較兩個對象我想下面的代碼。完全有效。

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

相關問題