以角度动态方式将键和值添加到现有对象

时间:2017-07-04 11:04:40

标签: javascript angular

我想在Angular中为现有Object添加一个值,我从服务调用中获取对象,在将其保存到本地存储之前,我想保存时间戳。

我正在使用Object.assign作为相同的

问题是用户是使用接口键入的,如果我向其添加任何属性,则说明该属性未在接口中定义,并且接口类不是由我根据Firebase用户信息编写的。我不想编辑该界面或添加它。我想动态创建一个新的属性。

与Java中的反射相似,并在Javascript中向对象添加动态值。

这就是我试过的

this.afAuth.authState.subscribe((data) => {
  console.log("Here");
  if (data) {
    const value = Object.assign(data,{TimeStamp : new Date().getTime()}); // this assign is not working even having obj in variable dosent help  
    console.log("Value"+JSON.stringify(value));
    localStorage.setItem("user", JSON.stringify(value));
    this.user = data;
    this.service.fetchData(this.user.uid).subscribe((res) => {
      this.comments = res;
    });
  } else {
    this.comments = null;
  }
});

提前感谢任何帮助

2 个答案:

答案 0 :(得分:0)

使用下面提到的作业 data.TimeStamp = new Date().getTime()是正确的方法。

this.afAuth.authState.subscribe((data) => {
  console.log("Here");
  if (data) {
   data.TimeStamp = new Date().getTime() // this assign is not working even having obj in variable dosent help  
    console.log("Value"+JSON.stringify(data));
    localStorage.setItem("user", JSON.stringify(data));
    this.user = data;
    this.service.fetchData(this.user.uid).subscribe((res) => {
      this.comments = res;
    });
  } else {
    this.comments = null;
  }
});

答案 1 :(得分:0)

您可以扩展Firebase用户界面并添加时间戳,然后使用扩展接口代替默认接口。

interface MyUser extends User {
    timeStamp: any;
}

然后你可以将timeStamp添加到数据对象中,如下所示:

 data.timestamp = {TimeStamp : new Date().getTime()}
 console.log("data",data);

您不需要使用Object.assign,您只需直接在对象上添加键值即可。

您希望在界面中为timeStamp指定正确的类型,如果您将该值作为字符串携带,请将其设为字符串,但任何内容都是安全的起点。

确保将您的本地用户变量键入扩展接口。

public user: MyUser;

this.afAuth.authState.subscribe((data) => {
  console.log("Here");
  if (data) {
    data.timestamp = {TimeStamp : new Date().getTime()}
    console.log("data: "+JSON.stringify(data));
    localStorage.setItem("user", JSON.stringify(data));
    this.user = data;
    this.service.fetchData(this.user.uid).subscribe((res) => {
      this.comments = res;
    });
  } else {
    this.comments = null;
  }
});