Замените все свойства объекта новым именем

#javascript #arrays #typescript #object

#javascript #массивы #typescript #объект

Вопрос:

Я хочу заменить все свойства объекта 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
      }
    ]
  },
  ...
]
  

Ответ №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);  

Обновление: вы можете попробовать использовать регулярное выражение следующим образом:

 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);  

Комментарии:

1. Я уже пробовал это, но это не изменяет свойство дочерних элементов.

2. @mrks, используйте replaceAll() вместо replace() , пожалуйста, проверьте обновленный ответ 🙂

3. Спасибо за быстрое изменение, но replaceAll , к сожалению, не существует в type string .

4. @mrks, вы можете попробовать второе решение, используя регулярное выражение в обновленном ответе 🙂

Ответ №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));