Обход строки JSON до внутренних уровней с использованием рекурсивной функции с использованием JavaScript

1

У меня есть вход JSON, который может идти на любое количество уровней.

Вот пример

var testJSON = [
    {
      'name':'USER1',
      'id':1,
      'child':[],
    },{
      'name':'USER2',
      'id':2,
      'child':[{
           'name':'USER2_CHILD1',
           'id':21,
           'child':[]
         },{
           'name':'USER2_CHILD2',
           'id':22,
           'child':[{
              'name':'USER2_CHILD2_CHILD1',
              'id':221,
              'child':[]
            }]
        }],
    },{
      'name':'USER3',
      'id':3,
      'child':[{
        'name':'USER3_CHILD1',
        'id':31,   
        'child':[]
      }],
    }];

Я хочу добавить данные JSON в дочерний массив, найдя соответствующий идентификатор, используя рекурсивную функцию. Например, если вы хотите добавить объект JSON в id == 1; то это было возможно с помощью цикла for, но что, если я хочу добавить объект JSON в id == 22 или id == 221.

Я пытаюсь использовать ниже код

var body = '';

function scan(obj)
{
  var k;
  if (obj instanceof Object) {
    for (k in obj){
        if (obj.hasOwnProperty(k)){
            body += 'scanning property ' + k + '<br/>';
            scan( obj[k] );  
        }                
    }
  } else {
    body += 'found value : ' + obj + '<br/>';
  };
 };

 scan(testJSON);

 document.getElementById('output').innerHTML = body;
Теги:
angular
angular6
ecmascript-6

2 ответа

2

Вы можете использовать итерацию с проверкой и вернуть объект, если он найден.

function getObject(array, id) {
    var object;
    array.some(o => object = o.id === id && o || getObject(o.child || [], id));
    return object;
}

var data = [{ name: "USER1", id: 1, child: [] }, { name: "USER2", id: 2, child: [{ name: "USER2_CHILD1", id: 21, child: [] }, { name: "USER2_CHILD2", id: 22, child: [{ name: "USER2_CHILD2_CHILD1", id: 221, child: [] }] }] }, { name: "USER3", id: 3, child: [{ name: "USER3_CHILD1", id: 31, child: [] }] }];

console.log(getObject(data, 1));
console.log(getObject(data, 21));
console.log(getObject(data, 221));
  • 0
    Что делать, если я хочу подтолкнуть объект в любой из дочерних и обновить переменную данных
  • 0
    вы получаете объект обратно или нет и можете вставить новый объект в child свойство.
0

Попробуйте эту функцию, вам необходимо проанализировать JSON до

function insertRecord(id,dataToInsert,jsonInput){

    let checkIndex = function (arrayElement){
        return arrayElement.id === id;
    }

    let index = jsonInput.findIndex(checkIndex);

    if(index != -1) {
     if(jsonInput[index].child) {
        jsonInput[index].child.push(dataToInsert);
     }
     else {
        jsonInput[index].child = [dataToInsert];
     }
    }
    else {

      jsonInput.forEach(function(arrEle, eleIndex){
        if(arrEle.child) {
        insertRecord(id,dataToInsert,arrEle.child);
        }
      });
    }
}

insertRecord(22,{
  'name':'USER1',
  'id':33,
  'child':[],
},testJSON);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню