Как отфильтровать родительский json из идентификатора ребенка в javascript / vuejs - PullRequest
0 голосов
/ 19 сентября 2018

Итак, у меня есть этот json.

{
    "account_owner": "",
    "account_type": "",
    "nest_uid": "17_15_1536914882_yhHDzQsDSI",
    "business_name": "",
    "sync_block": false,
    "validation": {
        "isError": false,
        "inputList": [],
        "message": ""
    },
    "is_selected": true,
    "contacts": [{
            "con_title": "",
            "con_fName": "",
            "con_lName": "",
            "con_job_title": "",
            "is_selected": true,
            "emails": [{
                "email": "",
                "type": "",
                "primary": false,
                "is_selected": true,
                "nest_uid": "17_15_1536914882_yhHDzQsDSK",
                "validation": {
                    "isError": false,
                    "inputList": [],
                    "message": "",
                    "is_selected": true
                },
                "checked": false
            }],
            "phones": [{
                "phone": "",
                "type": "",
                "primary": false,
                "is_selected": true,
                "nest_uid": "17_15_1536914882_uHN38SxJ3s",
                "validation": {
                    "isError": false,
                    "inputList": [],
                    "is_selected": true,
                    "message": ""
                },
                "checked": false
            }],
            "nest_uid": "17_15_1536914882_hwzB7dIn9v",
            "checked": false
        },
        {
            "con_title": "",
            "con_fName": "",
            "con_lName": "",
            "con_job_title": "",
            "is_selected": true,
            "emails": [{
                "email": "",
                "type": "",
                "primary": false,
                "is_selected": true,
                "nest_uid": "17_15_1536914882_yhHDzQsDSx",
                "validation": {
                    "isError": false,
                    "is_selected": true,
                    "inputList": [],
                    "message": ""
                },
                "checked": false
            }],
            "phones": [{
                "phone": "",
                "type": "",
                "primary": false,
                "is_selected": true,
                "nest_uid": "17_15_1536914882_uHN38SxJ3Y",
                "validation": {
                    "isError": false,
                    "is_selected": true,
                    "inputList": [],
                    "message": ""
                },
                "checked": false
            }],
            "nest_uid": "17_15_1536914882_hwzB7dIn9x",
            "checked": false
        }
    ]
}

вы можете видеть, что на каждом уровне есть два свойства

  1. nest_uid

  2. is_selected

Теперь я получаю дочерний элемент nest_uid, поэтому мне нужно пометить все is_selected как ложные, кроме выбранного и его parent .

Например

, если nest_id = '17_15_1536914882_yhHDzQsDSK'

Выход

{
    "account_owner": "",
    "account_type": "",
    "nest_uid": "17_15_1536914882_yhHDzQsDSI",
    "business_name": "",
    "sync_block": false,
    "validation": {
        "isError": false,
        "inputList": [],
        "message": ""
    },
    "is_selected": true,//here
    "contacts": [{
            "con_title": "",
            "con_fName": "",
            "con_lName": "",
            "con_job_title": "",
            "is_selected": true, //here 
            "emails": [{
                "email": "",
                "type": "",
                "primary": false,
                "is_selected": true,
                "nest_uid": "17_15_1536914882_yhHDzQsDSK", //here
                "validation": {
                    "isError": false,
                    "inputList": [],
                    "message": "",
                    "is_selected": true
                },
                "checked": false
            }],
            "phones": [{
                "phone": "",
                "type": "",
                "primary": false,
                "is_selected": false,
                "nest_uid": "17_15_1536914882_uHN38SxJ3s",
                "validation": {
                    "isError": false,
                    "inputList": [],
                    "is_selected": true,
                    "message": ""
                },
                "checked": false
            }],
            "nest_uid": "17_15_1536914882_hwzB7dIn9v",
            "checked": false
        },
        {
            "con_title": "",
            "con_fName": "",
            "con_lName": "",
            "con_job_title": "",
            "is_selected": false,
            "emails": [{
                "email": "",
                "type": "",
                "primary": false,
                "is_selected": false,
                "nest_uid": "17_15_1536914882_yhHDzQsDSx",
                "validation": {
                    "isError": false,
                    "is_selected": false,
                    "inputList": [],
                    "message": ""
                },
                "checked": false
            }],
            "phones": [{
                "phone": "",
                "type": "",
                "primary": false,
                "is_selected": false,
                "nest_uid": "17_15_1536914882_uHN38SxJ3Y",
                "validation": {
                    "isError": false,
                    "is_selected": false,
                    "inputList": [],
                    "message": ""
                },
                "checked": false
            }],
            "nest_uid": "17_15_1536914882_hwzB7dIn9x",
            "checked": false
        }
    ]
}

1 Ответ

0 голосов
/ 19 сентября 2018

Рекурсия действительно ответ здесь.Нечто подобное должно работать, даже если оно не самое красивое:

function selectInJSON(uid, current) {
  current.is_selected = current.nest_uid === uid

  Object.values(current).forEach((child) => {
      if (Array.isArray(child)) {
        child.forEach((item) => {
          selectInJSON(uid, item)
          if (item.is_selected) current.is_selected = true
        })
      }
      else if (Object(child) === child) {
        selectInJSON(uid, child)
        if (child.is_selected) current.is_selected = true
      }
  })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...