【问题标题】:Replace all object properties with a new name用新名称替换所有对象属性
【发布时间】:2020-10-15 12:22:45
【问题描述】:

我想将所有对象属性label替换为属性名称text

给定:

[
  {
    "value": "45a8",
    "label": "45A8",
    "children": [
      {
        "value": "45a8.ba08",
        "label": "BA08",
        "children": [
          {
            "value": "45a8.ba08.45a8",
            "label": "45A8"
          }
        ],
        "checked": false
      }
    ]
  },
  ...
]

需要:

[
  {
    "value": "45a8",
    "text": "45A8",
    "children": [
      {
        "value": "45a8.ba08",
        "text": "BA08",
        "children": [
          {
            "value": "45a8.ba08.45a8",
            "text": "45A8"
          }
        ],
        "checked": false
      }
    ]
  },
  ...
]

【问题讨论】:

    标签: javascript arrays typescript object


    【解决方案1】:

    您可以先将数据字符串化为JSON.stringify(),然后替换字符串。最后用JSON.parse()解析字符串:

    var data = [
      {
        "value": "45a8",
        "label": "45A8",
        "children": [
          {
            "value": "45a8.ba08",
            "label": "BA08",
            "children": [
              {
                "value": "45a8.ba08.45a8",
                "label": "45A8"
              }
            ],
            "checked": false
          }
        ]
      }
    ];
    
    data = JSON.parse(JSON.stringify(data).replaceAll('"label"', '"text"'));
    console.log(data);

    更新:您可以尝试使用 RegEx,如下所示:

    var data = [
      {
        "value": "45a8",
        "label": "45A8",
        "children": [
          {
            "value": "45a8.ba08",
            "label": "BA08",
            "children": [
              {
                "value": "45a8.ba08.45a8",
                "label": "45A8"
              }
            ],
            "checked": false
          }
        ]
      }
    ];
    var find = '"label"';
    var re = new RegExp(find, 'g');
    data = JSON.parse(JSON.stringify(data).replace(re, '"text"'));
    console.log(data);

    【讨论】:

    • 我已经尝试过了,但这并没有改变子元素的属性。
    • @mrks,使用replaceAll() 而不是replace(),请检查更新的答案:)
    • 感谢您的快速更改,但很遗憾,replaceAll 类型上不存在 string
    • @mrks,您可以在更新的答案中使用 regex 尝试第二种解决方案:)
    【解决方案2】:

    您还可以浏览键并找到标签键。获取它的值,将其分配给新键,即文本,并删除旧键,即标签。

    let data = [
          {
            "value": "45a8",
            "label": "45A8",
            "children": [
              {
                "value": "45a8.ba08",
                "label": "BA08",
                "children": [
                  {
                    "value": "45a8.ba08.45a8",
                    "label": "45A8"
                  }
                ],
                "checked": false
              }
            ]
          }
        ]
        
        for (const key in data.keys()){
          if(key === "label"){
            data.text = data[key]
            delete data.key
          }
        }
    

    【讨论】:

      【解决方案3】:

      您也可以使用recursion 来执行此操作。可能是这样的:

      const nestArr=[ { "value": "45a8", "label": "45A8", "children": [ { "value": "45a8.ba08", "label": "BA08", "children": [ { "value": "45a8.ba08.45a8", "label": "45A8" } ], "checked": false } ] }];
      
      changeLabelToText=arr=>{
          return arr.map(({label,...rest})=>{
            if(rest.children) rest.children = changeLabelToText(rest.children);
            return {text:label, ...rest}
          })
      };
      
      console.log(changeLabelToText(nestArr));

      【讨论】:

        猜你喜欢
        • 2020-04-19
        • 1970-01-01
        • 2019-12-03
        • 1970-01-01
        • 2022-01-17
        相关资源
        最近更新 更多