2016-06-13 117 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);