2012-05-05 19 views
5

Tôi có đầu vào JSON có thể chuyển đến bất kỳ số lượng cấp nào.di chuyển ngang qua chuỗi JSON đến các cấp bên trong bằng cách sử dụng hàm đệ quy

Tôi đưa ra một mẫu đầu vào của

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" 
        } 
       ] 
     } 
    ] 

}}); 

Tôi muốn thêm giá trị quan trọng "Entity" trong tất cả các cấp để một mảng sử dụng đệ quy,

tôi có thể thu thập dữ liệu từ cấp độ đầu tiên bằng cách sử dụng chuỗi

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

Làm cách nào để chuyển đến cấp độ bên trong cho chuỗi JSON bằng chức năng đệ quy?

+0

Đừng bỏ qua, đặt nếu và cảnh báo trước khi cuộc gọi quét –

+0

Thumbs up !!! Và cảm ơn rất nhiều !!!! Thực sự đánh giá cao sự giúp đỡ của bạn .. – user1371896

+0

@ElRonnoco Ive đã thử nghiệm với điều này và làm u knw hw chúng tôi cn thêm thực thể ở các cấp độ khác nhau vào cùng một mảng .. tức là các thực thể ở cấp 1 đi đến một mảng, cấp 2 đến nxt và như vậy trên .. – user1371896

Trả lời

15

Tôi đã thực hiện một jsfiddle mà đi qua mọi đối tượng, mảng và giá trị trong đối tượng JS như vậy ...

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

}; 

tôi nhận được không có lỗi đệ quy (trong Chrome). Bạn có thể sử dụng điều này để làm những gì bạn muốn?

Nếu bạn cần phải kiểm tra xem một đối tượng là một mảng sử dụng if (obj instanceof Array)

Để kiểm tra xem một đối tượng có một "thực thể" sử dụng tài sản if (obj.hasOwnProperty('entity'))

Để thêm (hoặc sửa đổi một hiện) "thực thể" sở hữu sử dụng obj.entity = value hoặc obj['entity'] = value

+1

Tôi đã trả lời điều này trên iPhone của tôi để nếu ai đó có thể sửa định dạng của tôi, tôi sẽ rất biết ơn! –

+0

hiển thị lỗi, nếu là nt được xác định cho Nếu (h.hasOwnProperty (k)) – user1371896

+0

Ah bạn có thể mới để kiểm tra 'if (h instanceof object)' trước khi vào vòng lặp. –

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

Tôi chưa thêm logic của bạn, nhưng bạn có ý tưởng về cách đệ quy di chuyển đối tượng của mình.

+0

để thử cách này ... sẽ cung cấp phản hồi ua aftr that .. – user1371896

+0

làm thế nào để tôi thêm giá trị của subobj vào đây cho ví dụ trên? – user1371896

+0

Cái gì? Tôi không hiểu bình luận của bạn. –

1

nói rằng tôi có một cấu trúc như sau:

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

Trẻ em là một mảng kết hợp chứa nhiều aObject. Vì vậy, nó có thể trông như thế này:

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

Tôi có một mục có chứa một loạt các phân nhóm:

["subgroup1", "subgroup1a"] 

Mỗi nhóm là một 'vị trí'. Mục cần phải được đặt tại:

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

Ở mỗi cấp, chúng ta phải kiểm tra xem trẻ em [mảng] có tồn tại hay không và tạo ra nó. Bạn không thể đơn giản viết aObject.children [array [0]]. Children [array [1]]. Items.push (item) vì trẻ em [array [0]] có thể chưa tồn tại và chúng ta sẽ gặp lỗi.

Điều này có thể được giải quyết bằng cách sử dụng đệ quy! (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); 
    } 
}); 

Các aObject cuối cùng sẽ trông như thế này:

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

Đây là một chức năng mà tôi sử dụng thường xuyên. Nó dễ dàng sửa đổi để làm nhiều nhiệm vụ đệ quy. Ví dụ: nếu bạn thêm cờ bảo lãnh, bạn có thể nhanh chóng nhận được chồng hoặc thêm chức năng gọi lại làm cho nó trở nên tổng quát hơn.Dù sao thì đó là 2 xu của tôi

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'] 
Các vấn đề liên quan