首页 文章

用Object.assign更新对象而不是 生产环境 欲望结果

提问于
浏览
0

我需要更新现有的对象数据

oldData = {
  "fnol": {
    "operationStatus": {
      "statusCode": "200",
      "statusMessage": "Operation was successful."
    },
    "data": {
      "policies": [
        {
          "formattedPolicyNumber": "abc8",
          "producerCode": "TP109"
        },
        {
          "formattedPolicyNumber": "abc8",
          "producerCode": "TP110"
        }
      ],
      "user": {
        "login": "URGENTNOTICES@test.COM",
        "firstName": "firsname",
        "lastName": "lastname",
        "dateOfBirth": "1960-01-01",
        "phone": {
          "number": "3242342342",
          "extension": "5454"
        }
      }
    }
  }
}

需要更新

let editedData = {
    "fnol":{
    "data":{
        "user":{
                "phone":{"number":"","extension":""}
            }   
        }
    }
}

editedData = editedData.fnol.data.user.phone.number = '0000000000';

所以我正在尝试使用更新用户电话号码

newData = new Object.assign({}, oldData, editedData);

但是我仍然在使用更新的数字获取oldData对象?

提前致谢

2 回答

  • 0

    要达到预期效果,请使用以下选项

    • 首先将oldData分配给editedData

    • 更改editedData的电话号码

    • 分配给newData

    var oldData = {
      "fnol": {
        "operationStatus": {
          "statusCode": "200",
          "statusMessage": "Operation was successful."
        },
        "data": {
          "policies": [
            {
              "formattedPolicyNumber": "abc8",
              "producerCode": "TP109"
            },
            {
              "formattedPolicyNumber": "abc8",
              "producerCode": "TP110"
            }
          ],
          "user": {
            "login": "URGENTNOTICES@test.COM",
            "firstName": "firsname",
            "lastName": "lastname",
            "dateOfBirth": "1960-01-01",
            "phone": {
              "number": "3242342342",
              "extension": "5454"
            }
          }
        }
      }
    } 
    
    let editedData = Object.assign({}, oldData)
    
    
    eeditedData = editedData.fnol.data.user.phone.number = '0000000000';
    
    var newData = Object.assign({}, oldData, editedData);
    
    console.log(newData);
    

    codepen - https://codepen.io/nagasai/pen/QzWaXG?editors=1010

  • 1

    您可以使用这样的函数来沿路径更改(或添加)值:

    const oldData = {"fnol": {"data": {"policies": [{"formattedPolicyNumber": "abc8", "producerCode": "TP109"}, {"formattedPolicyNumber": "abc8", "producerCode": "TP110"}], "user": {"dateOfBirth": "1960-01-01", "firstName": "firsname", "lastName": "lastname", "login": "URGENTNOTICES@test.COM", "phone": {"extension": "5454", "number": "3242342342"}}}, "operationStatus": {"statusCode": "200", "statusMessage": "Operation was successful."}}}
    
    const None = Symbol()
    
    const setPath = ([ p = None, ...ps ]) => (val) => obj => 
      p === None
        ? { ...obj }
        : ps.length == 0
          ? { ...obj, [p]: val }
          : { ...obj, [p]: setPath (ps) (val) (obj[p]) }
    
    const newData = setPath 
      (['fnol', 'data', 'user', 'phone', 'number']) 
      ('0000000000')
      (oldData)
    
    console.log(newData)
    
    .as-console-wrapper {height: 100vh !important}
    

    这不会修改您的原始数据 . 它只处理对象,而不是数组 . 添加这些并不困难 .

    如果您想使用 . 分隔的字符串而不是数组,则可以为该版本添加光泽,如下所示:

    const setPathStr = (str) => setPath(str.split('.'))
    
    const newData = setPathStr
      ('fnol.data.user.phone.number')
      ('0000000000')
      (oldData)
    

    但请注意这种灵活性的降低 . 路径中的节点不能再包含 . 字符 . 这对您来说可能是也可能不是问题,但对于一般的效用函数来说,这是一个真正的问题 .

    这个功能从Ramda的assocPath功能中获取灵感 . (我是Ramda的作者 . )

相关问题