Вопрос по javascript, json, arrays – прохождение через строку JSON на внутренние уровни с использованием рекурсивной функции

6

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

Я даю входную выборку

var d=getEntities( {"Categories": 
{
"Facets": 
    [
    {
    "count": 1,
    "entity": "Company",
    "Company": 
            [
            {

            "entity": "Ford Motor Co",

            "Ford_Motor_Co": 
                [
                    {
                    "count": 1,
                    "entity": "Ford"
                    }
                ]
            }
            ]
    },
        {
            "count": 4,
            "entity": "Country",
              "Country": [
                    {

                        "entity": "Germany",
                         "Germany": [
                                {
                                    "count": 1,
                                    "entity": "Germany"
                                }
                          ],
                        "currency": "Euro (EUR)"
                    },
                    {

                         "entity": "Italy",
                        "Italy": [
                                {
                                     "count": 1,
                                     "entity": "Italy"
                                }
                          ],
                        "currency": "Euro (EUR)"
                    },
                    {

                        "entity": "Japan",
                          "Japan": [
                             {
                                    "count": 1,
                                    "entity": "Japan"
                             }
                          ],
                        "currency": "Yen (JPY)"
                    },
                    {

                        "entity": "South Korea",
                          "South_Korea": [
                              {
                                    "count": 1,
                                    "entity": "South Korea"
                                }
                          ],
                      "currency": "Won (KRW)"
                    }
              ]
        },
        {"count": 5,
              "entity": "Persons",
              "Persons": [
                    {
                         "count": 2,
                        "entity": "Dodge"
                    },
                    {
                        "count": 1,
                        "entity": "Dodge Avenger"
                    },
                    {
                        "count": 1,
                        "entity": "Major League"
                    },
                    {
                        "count": 1,
                        "entity": "Sterling Heights"
                    }
              ]
        }
  ]

}});

Я хочу добавить значение ключа "Entity" на всех уровнях в массив с использованием рекурсии,

Я могу собирать данные с первого уровня, используя строку

<html>
<head>
<script src="jquery.js" type="text/javascript"></script>
<script type="text/javascript" src="dataDumper.js"></script>


<script type="text/javascript">

var testJSON = {"Categories": 
{
"Facets": 
    [
    {
    "count": 1,
    "entity": "Company",
    "Company": 
            [
            {

            "entity": "Ford Motor Co",

            "Ford_Motor_Co": 
                [
                    {
                    "count": 1,
                    "entity": "Ford"
                    }
                ]
            }
            ]
    },
        {
            "count": 4,
            "entity": "Country",
              "Country": [
                    {

                        "entity": "Germany",
                         "Germany": [
                                {
                                    "count": 1,
                                    "entity": "Germany"
                                }
                          ],
                        "currency": "Euro (EUR)"
                    },
                    {

                         "entity": "Italy",
                        "Italy": [
                                {
                                     "count": 1,
                                     "entity": "Italy"
                                }
                          ],
                        "currency": "Euro (EUR)"
                    },
                    {

                        "entity": "Japan",
                          "Japan": [
                             {
                                    "count": 1,
                                    "entity": "Japan"
                             }
                          ],
                        "currency": "Yen (JPY)"
                    },
                    {

                        "entity": "South Korea",
                          "South_Korea": [
                              {
                                    "count": 1,
                                    "entity": "South Korea"
                                }
                          ],
                      "currency": "Won (KRW)"
                    }
              ]
        },
        {"count": 5,
              "entity": "Persons",
              "Persons": [
                    {
                         "count": 2,
                        "entity": "Dodge"
                    },
                    {
                        "count": 1,
                        "entity": "Dodge Avenger"
                    },
                    {
                        "count": 1,
                        "entity": "Major League"
                    },
                    {
                        "count": 1,
                        "entity": "Sterling Heights"
                    }
              ]
        }
  ]

}};

function scan(obj)
{
    var k;
    if (obj.hasOwnProperty('entity')) {



        for (k in obj){
           if (obj.hasOwnProperty(k)){


                scan( obj[k] );  


            }                
          }
    } 


    else{
        if(k=='entity')
        {
        alert(obj.entity);
   }
    }


};

scan(testJSON);



</script>
</head>

<body>

</body>

</html>

Как мне попасть на внутренние уровни для строки JSON с помощью рекурсивных функций?

без использования «ключа», знаете ли вы, как выполнить ту же операцию, используя массив ... user1371896
Я не понимаю, что вы имеете в виду. Вы можете добавить любое новое свойство к объекту Json, просто сказав, например, что Main.new = 1 создаст свойство «новый»; в объекте Main. Если вы хотите создать новый объект Json, используйте {}. Для создания массива используйте []. чтобы добавить объект Json в массив, используйте myarray.push ({}). Чтобы добавить массив в массив, используйте myarray.push ([]) El Ronnoco
Пальцы вверх!!! И большое спасибо !!!! Очень ценю вашу помощь. user1371896
@ElRonnoco Я экспериментировал с этой вещью, и мы знаем, как мы можем добавить объекты на разных уровнях в один и тот же массив ... т.е. объекты на уровне 1 переходят в один массив, на уровне 2 - в nxt и так далее ... user1371896
Не вставляйте еще, вставьте if и предупредите перед вызовом для сканирования El Ronnoco

Ваш Ответ

4   ответа
1

которую я часто использую. Он легко модифицируется для выполнения многих рекурсивных задач. Например, если вы добавите флаг освобождения под залог, вы можете быстро получить стек или добавить функцию обратного вызова, которая делает его еще более общим. Во всяком случае, это мои 2 цента

var recursiveObjMap = (function(){
  var stack = [];
  var result = [];
  // var bail = false;
  return function map(data, key){
    if (!$.isArray(data) && !$.isPlainObject(data) ) { 
      result.push(data);
      return false 
    }

    $.each(data, function(i, v){
      if (key) stack.push(key);
      map(v, i);
      stack.pop();
    });
    return result;
  };
})();

recursiveObjMap({a:'b',c:{d:{e:"f"}}}) // ['b', 'f']
1
(function recur( obj ) {
    Object.keys( obj ).forEach( function( prop ) {
        // Check if the property is an object
        if ( ({}).toString.apply( prop ) === '[object Object]' ) {
            // If it is, recall this function
            recur( prop );
        }
    } );
} () );

но вы получили представление о том, как рекурсивно пройти ваш объект.

позвольте мне попробовать ... даст вам обратную связь, что .. user1371896
Какие? Я не понимаю ваш комментарий.
Как мне добавить значение subobj здесь для приведенного выше примера? user1371896
Я не понял, что такое subobj .. user1371896
16

jsfiddle который пересекает каждый объект, массив и значение в объекте JS, как это ...

function scan(obj)
{
    var k;
    if (obj instanceof Object) {
        for (k in obj){
            if (obj.hasOwnProperty(k)){
                //recursive call to scan property
                scan( obj[k] );  
            }                
        }
    } else {
        //not an Object so obj[k] here is a value
    };

};

Я не получаю ошибку рекурсии (в Chrome). Можете ли вы использовать это, чтобы делать то, что вы хотите?

Если вам нужно проверить, является ли объект массивом, используйтеif (obj instanceof Array)

Чтобы проверить, имеет ли объект «сущность» использование недвижимостиif (obj.hasOwnProperty('entity'))

Добавить (или изменить существующую) «сущность» использование недвижимостиobj.entity = value или жеobj['entity'] = value

Я ответил на это на своем iPhone, поэтому, если кто-то сможет исправить мое форматирование, я буду очень признателен !!!
показывает ошибку, если не определено для If (h.hasOwnProperty (k)) user1371896
«Остановить выражение» тот, который я использовал в своем ответе:if ( ({}).toString.apply( prop ) === '[object Object]' ) {, Btw,Object.keys возвращает массив перечисляемых свойств, поэтому его не нужно использоватьhasOwnProperty.
Возможно, вы новичок в тестировании на "if (h instanceof object)" перед входом в цикл.
нет ,,, это был формат вашего кода ... Я был в большом письме .. Теперь он предупреждает сначала компанию Company, а затем показывает "слишком много рекурсии" для getEntities (h [k]); user1371896
1

var aObject = {
    items: [],
    children: {}
}

Children - это ассоциативный массив, который содержит больше объектов aObject. Так это может выглядеть так:

var aObject = {
    items: [],
    children: {
        "subgroup1": {
            items: [],
            children: {}
        },
        "subgroup2": {
            items: [],
            children: {}
        }
    }
}

У меня есть элемент, который содержит массив подгрупп:

["subgroup1", "subgroup1a"]

Каждая подгруппа является «местоположением». Предмет должен быть размещен по адресу:

aObject.children[array[0]].children[array[1]].items

На каждом уровне мы должны проверить, существуют ли дочерние элементы [array [i]], и если нет, создать его. Вы не можете просто написать aObject.children [array [0]]. Children [array [1]]. Items.push (item), потому что children [array [0]], возможно, еще не существует, и мы получим ошибку.

Это можно решить с помощью рекурсии! (AngularJS)

function recursive(aLevel, aItem, aArray, aIndex){
    var lLevel = aLevel;

    // If we have reached the end of the array
    if (aIndex === aArray.length){
        // Insert
        aLevel.items.push(aItem);
    } else {

        // If the subgroup doesn't exist, create it
        if (typeof aLevel.children[aArray[aIndex]] === 'undefined'){
            aLevel.children[aArray[aIndex]] = {
              items: [],
              children: {}
            };
        }

        // Move into
        recursive(aLevel.children[aArray[aIndex]], aItem, aArray, aIndex+1);
    }
}

aObject = {
    items: [],
    children: {},
}

angular.forEach(items, function(item, i){
    var location = item.location;

    if (location.length == 0){
        aObject.items.push(item);
    } else {
        recursive(aObject, item, location, 0);
    }
});

Конечный объект будет выглядеть так:

var aObject = {
     items: [],
     children: {
        "subgroup1": {
            items: [],
            children: {
                "subgroup1a": {
                    items: [item],
                    children: {}
                }
            }
        },
        "subgroup2": {
            items: [],
            children: {}
        }
    }
}

Похожие вопросы