Как рекурсивно изменить значения в объекте? - PullRequest
0 голосов
/ 28 марта 2020

У меня есть следующий объект, и я хочу изменить все значения ключа «выборы» с «да, нет» на «показать, скрыть».

Я пытался создать функцию рекурсии для l oop над подэлементами объекта - но по какой-то причине я не могу заставить его работать ...

            var foo = {
            "data": [
                {
                    "body": [
                        {
                            "id": "title",
                            "label": "title",
                            "subType": "title",
                            "type": "text"
                        },
                        {
                            "id": "page1",
                            "label": "Home",
                            "choices": [
                                "show",
                                "hide"
                            ],
                            "childrenItems": [
                                {
                                    "id": "subMenu1",
                                    "label": "Gallery",
                                    "choices": [
                                        "yes",
                                        "no"
                                    ],
                                    "childrenItems": [
                                        {
                                            "id": "subMenu2",
                                            "label": "Artists",

                                            "choices": [
                                                "yes",
                                                "no"
                                            ],
                                            "childrenItems": [
                                                {
                                                    "id": "modernisem",
                                                    "label": "Modernisem"

                                                },
                                                {
                                                    "id": "contemporery",
                                                    "label": "Contemporery"

                                                }
                                            ]
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        }

        function setQuestionnaireChoises(prmData) {

        return getNestedElements(prmData)
        }

        function getNestedElements(prmData){
        if(!isObject && Array.isArray(prmData)){
            return getArrItems(prmData);
        }else{
            return getObjItems(prmData);
        }
        }

        function getArrItems(prmData){

            for (let index = 0; index < prmData.length; index++) {
                let arrItem = prmData[index];
                if(isObject){
                return getObjItems(arrItem)
                }else{
                    return getArrItems(arrItem)
                }

            }
        }

        function getObjItems(prmData){
            for (const key in prmData) {
                    let objItem = prmData[key];
                    if(key == 'choices'){
                    return objItem[key] = ["show, hide"]
                    }else{
        return  objItem[key]
                    }


            }

        }
        function isObject(prmObj) {
            return prmObj !== null && typeof prmObj === 'object' && Array.isArray(prmObj) === false ? true : false;
        }


        setQuestionnaireChoises(foo)

Моя цель - манипулировать объектом, чтобы возвращать себя с изменениями выбора .... Спасибо.

JsBin

1 Ответ

2 голосов
/ 28 марта 2020

Код слишком большой и сложный. Вы можете легко сделать это следующим образом. Пусть данные равны

 var foo = {
  "data": [
    {
      "body": [
        {
          "id": "title",
          "label": "title",
          "subType": "title",
          "type": "text"
        },
        {
          "id": "page1",
          "label": "Home",
          "choices": [
            "show",
            "hide"
          ],
          "childrenItems": [
            {
              "id": "subMenu1",
              "label": "Gallery",
              "choices": [
                "yes",
                "no"
              ],
              "childrenItems": [
                {
                  "id": "subMenu2",
                  "label": "Artists",

                  "choices": [
                    "yes",
                    "no"
                  ],
                  "childrenItems": [
                    {
                      "id": "modernisem",
                      "label": "Modernisem"

                    },
                    {
                      "id": "contemporery",
                      "label": "Contemporery"

                    }
                  ]
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

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

function setQuestionnaireChoises(prmData) {
  if (!(typeof prmData === 'object' || Array.isArray(prmData))) {
    return
  }
  if (prmData.choices) {
    prmData.choices = ['show', 'hide'];
  }
  Object.keys(prmData).forEach((key) => {
    setQuestionnaireChoises(prmData[key])
  });
}

setQuestionnaireChoises(foo);
console.log(JSON.stringify(foo))

Код JsBin

...