我在将两个json对象连接在一起时遇到问题。基本上我的应用程序每秒都在我的休息服务器上运行,我只发送最新的数据,因为角度正在刷新我在谷歌上发现的整个对象,我可以连接2个jsons(旧的和新的)所以我可以保留一切。但问题是concat / merge / extend函数都没有工作,我也不知道我错过了什么。
data: any = null;
constructor(private _http: Http) {
setInterval(() => this.getLogs(), 1000)
}
public getLogs() {
return this._http.get('http://localhost')
.map((res: Response) => res)
.subscribe(data => {
if data._body != ''{
//this.data = data.json()
if this.data == null
this.data = data.json();
else
extend(this.data,data.json()); // PROBLEM HERE
}
console.log(this.data);
});
}
到目前为止,我尝试this.data.concat(data.json());
,如果我尝试extend(this.data, data.json())
或merge(this.data, data.json());
,我会收到错误消息,说明它未定义。 concat函数没有做任何事情。不会触发错误,也不会让我知道它在做什么。
我记录了对象everytme,我可以看到对象始终保持在我得到的第一个响应(意味着它只做if this.data == null)。
答案 0 :(得分:1)
https://www.w3schools.com/jsref/jsref_concat_array.asp states
The concat() method is used to join two or more arrays.
This method does not change the existing arrays, but returns a new array, containing the values of the joined arrays.
So you need to concat the two arrays into the data variable
data: any = null;
constructor(private _http: Http) {
setInterval(() => this.getLogs(), 1000)
}
public getLogs() {
return this._http.get('http://localhost')
.map((res: Response) => res)
.subscribe(data => {
if data._body != ''{
//this.data = data.json()
if this.data == null
this.data = data.json();
else
this.data = this.data.concat(data.json());
}
console.log(this.data);
});
}
答案 1 :(得分:1)
您可以使用spread运算符生成新对象:
console.log( object['16'] )
这样做是创建一个新对象,然后首先从this.data = {...this.data, ...data.json()};
迁移所有字段和值,然后从this.data
迁移同一事物,同时覆盖已存在于此数据库中的任何现有字段。< / p>
答案 2 :(得分:0)
不确定您从哪里获得extend
。这不是一个功能。
你不能concat
两个对象在一起。您正在调用res.json()
,因此返回不再是JSON。即使你是,你也不能将JSON字符串连接在一起并期望结果有效。
您希望将对象合并在一起,可以使用Object.assign(this.data, data.json()
或点差:this.data = {...this.data, ...data.json()}
来完成。
除此之外,您还希望在分配之前尝试/捕获JSON解析。另外,你的地图功能实际上没什么。你可以在那里解析它。
您也可以通过将data
初始化为空对象来简化此操作。
public data: any = {}
public getLogs() {
return this._http.get('http://localhost')
.map(res => res.json())
.filter(res => !!res) // ensure data exists
.subscribe(data => {
Object.assign(this.data, data);
});
}
话虽如此,每秒进行一次REST调用似乎是对资源的极度浪费,并且会对Angular的变更检测造成压力,随着数据的增加性能会下降。如果不需要合并对象,即每个调用都是分段数据,请考虑将新数据推送到数组而不是对象。另外,您可能需要考虑做一些更合理的事情,比如在后端实现SSE(服务器发送事件)等事件流。