Angular没有合并/连接/扩展我的json对象

时间:2018-01-25 16:11:19

标签: json angular

我在将两个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)。

3 个答案:

答案 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(服务器发送事件)等事件流。