如何在不删除键的情况下从对象和嵌套对象中重置值

时间:2019-04-06 07:21:52

标签: javascript angular typescript object angular6

我已经创建了与多个组件共享数据的服务。毕竟,处理结束了,我需要重设服务对象的值。所以我尝试了this.UserDetails = {};,它清除了值并删除了嵌套对象。只需将值重置为默认分配为服务即可。

谢谢。

服务文件

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class dataService {
  constructor() { }
  UserDetails: any = {
    key1 : '' ,
    key2: {
      Status: false,
      Label: ''
    },
    key3: {
      Status: false,
      Label: ''
    },
    key4: {
      Status: false,
      Label: ''
    },
    key5: '',
    key6: '',
    key7: new Date(),

  }
}

在组件中分配值后,看起来就像

UserDetails = {
    key1 : 'value 1' ,
    key2: {
      Status: true,
      Label: 'label 1'
    },
    key3: {
      Status: false,
      Label: 'label 2'
    },
    key4: {
      Status: true,
      Label: 'label 3'
    },
    key5: 'key value 1',
    key6: 'key value 2',
    key7: new Date(),

  }
}

一旦我将数据传递到后端,然后需要将其重置为默认值服务文件

4 个答案:

答案 0 :(得分:0)

为什么不创建UserDetails类并用数据填充它。重置期间,只需返回该类的新实例即可。

请查看下面的演示片段,我已经使用ES6类来解释该概念,但是您可以将其扩展到Angular。

class UserDetails {
    key1 = '';
    key2 = {
      Status: false,
      Label: ''
    };
    key3 = {
      Status: false,
      Label: ''
    };
    key4 = {
      Status: false,
      Label: ''
    };
    key5 = '';
    key6 = '';
    key7 = new Date();
}
class MyService {
 userDetails;
 constructor(){
   this.userDetails = new UserDetails();
 }
 populate(){
  this.userDetails.key1 ="foo"
  this.userDetails.key2 = {
      Status: true,
      Label: 'bar'
  };
  return this.userDetails;
 }
 reset(){
  this.userDetails = new UserDetails();
  return this.userDetails;
 }
}
let service = new MyService();
console.log(service.populate());
console.log("***********Resetting************");
console.log(service.reset());

答案 1 :(得分:0)

根据我认为您想做的事情,您可以检查每个孩子的类型是否不是object

var UserDetails = {
  key1: '',
  key2: {
    Status: false,
    Label: ''
  },
  key3: {
    Status: false,
    Label: ''
  },
  key4: {
    Status: false,
    Label: ''
  },
  key5: '',
  key6: '',
  key7: new Date(),
};

Object.entries(UserDetails).forEach(([key, value]) => {
  if (typeof value != "object") {
    delete UserDetails[key];
  }
});

console.log(UserDetails);

答案 2 :(得分:0)

您可以使用reduce。将其值不是Object或它们是Date实例的键设置为空字符串。

const input = {
    key1 : '' ,
    key2: {
      Status: false,
      Label: ''
    },
    key3: {
      Status: false,
      Label: ''
    },
    key4: {
      Status: false,
      Label: ''
    },
    key5: '',
    key6: '',
    key7: new Date(),
}

const output = Object.entries(input).reduce((accu, [key, val]) => {
    if(typeof val != 'object' || input[key] instanceof Date) {
        accu[key] = "";
    } else {
        accu[key] = val;
    }
    return accu;
}, {});

console.log(output)

答案 3 :(得分:0)

您可以执行Amardeep Bhowmick的建议,也可以在服务中创建一个返回相同对象的简单函数。 具有这样的功能

private getUserDetailsObject():any{
    var userDetailsObject = {
            key1 : '' ,
            key2: {
              Status: false,
              Label: ''
            },
            key3: {
              Status: false,
              Label: ''
            },
            key4: {
              Status: false,
              Label: ''
            },
            key5: '',
            key6: '',
            key7: new Date(),

          }
    return userDetailsObject;
}

要重置对象时,您可以使用this.UserDetails = this.getUserDetailsObject(); 即使是第一次初始化对象,也可以使用相同的对象。