2015-03-05 10 views
5

के आधार पर मैं जैसेसमूहीकरण Json एकाधिक कुंजी

नीचे
[ 
    { 
    "category_id": "C1", 
    "category_name": "C1_Name", 
    "item_id": "C1_I1", 
    "item_name": "C1_I1_Name", 
    "variant_id": "C1_I1_V1", 
    "variant_name": "C1_I1_V1_ Name" 
    }, 
    { 
    "category_id": "C1", 
    "category_name": "C1_Name", 
    "item_id": "C1_I1", 
    "item_name": "C1_I1_Name", 
    "variant_id": "C1_I1_V2", 
    "variant_name": "C1_I1_V2_ Name" 
    }, 
    { 
    "category_id": "C1", 
    "category_name": "C1_Name", 
    "item_id": "C1_I2", 
    "item_name": "C1_I2_Name", 
    "variant_id": "C1_I2_V1", 
    "variant_name": "C1_I2_V1_ Name" 
    }, 
    { 
    "category_id": "C1", 
    "category_name": "C1_Name", 
    "item_id": "C1_I2", 
    "item_name": "C1_I2_Name", 
    "variant_id": "C1_I2_V2", 
    "variant_name": "C1_I2_V2_ Name" 
    }, 
    { 
    "category_id": "C2", 
    "category_name": "C2_Name", 
    "item_id": "C2_I1", 
    "item_name": "C2_I1_Name", 
    "variant_id": "C2_I1_V1", 
    "variant_name": "C2_I1_V1_ Name" 
    } 
] 

मैं समूह जावास्क्रिप्ट में Json एन करने के लिए 'के स्तर चाहते हैं एक JSON संरचना है, चाबियों का सूची में उत्तीर्ण होकर कहते हैं।

[ 
    { 
    "category_id": "C1", 
    "category_name": "C1_Name", 
    "item": [ 
     { 
     "item_id": "C1_I1", 
     "item_name": "C1_I1_Name", 
     "variant": [ 
      { 
      "variant_id": "C1_I1_V1", 
      "variant_name": "C1_I1_V1_ Name" 
      }, 
      { 
      "variant_id": "C1_I1_V2", 
      "variant_name": "C1_I1_V2_ Name" 
      } 
     ] 
     }, 
     { 
     "item_id": "C1_I2", 
     "item_name": "C1_I2_Name", 
     "variant": [ 
      { 
      "variant_id": "C1_I2_V1", 
      "variant_name": "C1_I2_V1_ Name" 
      }, 
      { 
      "variant_id": "C1_I2_V2", 
      "variant_name": "C1_I2_V2_ Name" 
      } 
     ] 
     } 
    ] 
    } 
] 

कैसे इस बारे में जाने के लिए पर मदद की जरूरत है सकते हैं: उदाहरण देकर category_id, ITEM_ID और variant_id के लिए, मैं निम्नलिखित प्रतिक्रिया की उम्मीद कर रहा हूँ?

मैंने निम्न की तरह कुछ करने की कोशिश की, लेकिन यह एक स्तर के लिए समूह है। मैं इसे रिकर्सिव करना चाहता हूं।

function groupBy(collection, property) { 
    var i = 0, val, index, values = [], result = []; 
    for (; i < collection.length; i++) { 
     val = collection[i][property]; 
     index = values.indexOf(val); 
     if (index > -1) 
      result[index].push(collection[i]); 
     else { 
      values.push(val); result.push([collection[i]]); 
     } 
    } 
    return result; 
} 
+0

मैं निम्नलिखित की तरह कुछ करने की कोशिश की इस डाल, लेकिन यह एक स्तर के लिए समूहों, मैं यह रिकर्सिव [कोड] फ़ंक्शन समूह (संग्रह, संपत्ति) { var i = 0, वैल, इंडेक्स, मान = [], परिणाम = []; (; i -1) परिणाम [अनुक्रमणिका] .push (संग्रह [i]); अन्य { मूल्य.push (वैल); परिणाम.push ([संग्रह [i]]); } } वापसी परिणाम; } – Madhan

+0

आप कुंजी नाम या मूल्यों की एक सूची पास करना चाहते हैं? – user937284

+0

मुख्य नाम (उपर्युक्त उदाहरण में, मुझे श्रेणी_आईडी, item_id, variant_id को सूची के रूप में पास करने की आवश्यकता है – Madhan

उत्तर

0

यहाँ काम (केवल जावास्क्रिप्ट) के अपने समाधान है:

function getItemByKey(arr, key, value){ 
    // here we look for existing group item in the result array 
    return arr.reduce(function (prev, cur) { 
     if (prev == null && cur[key] == value) { 
      return cur; 
     } 
     return prev; 
    }, null); 
} 

function checkPropForGroup(prop, key){ 
    // here we check which columns should stay in the group, 
    // and which should go down to group items. 
    return prop == key || prop == key.replace("_id", "_name"); 
} 

function cloneSuperItem(src, key){ 
    // create super item by copying only group related fields 
    var item = {}; 
    for (prop in src){ 
     if (checkPropForGroup(prop, key)){ 
      item[prop] = src[prop]; 
     } 
    } 
    item[key+'_group'] = []; 
    return item; 
} 

function cloneSubItem(src, key){ 
    // create sub-item by copying all but group related fields 
    var item = {}; 
    for (prop in src){ 
     if (!checkPropForGroup(prop, key)){ 
      item[prop] = src[prop]; 
     } 
    } 
    return item; 
} 

function groupArray(arr, args, lvl){ 
    var key = args[lvl]; 
    var result = []; 
    arr.forEach(function (item, ind, a){ 
     // find or create super item for group and then create sub item 
     // and push it there 
     var keyItem = getItemByKey(result, key, item[key]); 
     if (!keyItem){ 
      keyItem = cloneSuperItem(item, key); 
      result.push(keyItem); 
     } 
     subItem = cloneSubItem(item, key); 
     keyItem[key+'_group'].push(subItem); 
    }); 
    if (args[lvl+1]){ 
     // recursively make grouping on lower level 
     for (var i = 0; i < result.length; i++){ 
      result[i][key+'_group'] = 
       groupArray(result[i][key+'_group'], args, lvl + 1); 
     } 
    } 
    return result; 
} 

function groupArrayMain(arr, keysArray){ 
    // keys should be simply listed as parameters in order from top group to lower 
    return JSON.stringify(groupArray(arr, arguments, 1),null,'\n') 
} 

var arr = [ 
    { 
    "category_id": "C1", 
    "category_name": "C1_Name", 
    "item_id": "C1_I1", 
    "item_name": "C1_I1_Name", 
    "variant_id": "C1_I1_V1", 
    "variant_name": "C1_I1_V1_ Name" 
    }, 
    { 
    "category_id": "C1", 
    "category_name": "C1_Name", 
    "item_id": "C1_I1", 
    "item_name": "C1_I1_Name", 
    "variant_id": "C1_I1_V2", 
    "variant_name": "C1_I1_V2_ Name" 
    }, 
    { 
    "category_id": "C1", 
    "category_name": "C1_Name", 
    "item_id": "C1_I2", 
    "item_name": "C1_I2_Name", 
    "variant_id": "C1_I2_V1", 
    "variant_name": "C1_I2_V1_ Name" 
    }, 
    { 
    "category_id": "C1", 
    "category_name": "C1_Name", 
    "item_id": "C1_I2", 
    "item_name": "C1_I2_Name", 
    "variant_id": "C1_I2_V2", 
    "variant_name": "C1_I2_V2_ Name" 
    }, 
    { 
    "category_id": "C2", 
    "category_name": "C2_Name", 
    "item_id": "C2_I1", 
    "item_name": "C2_I1_Name", 
    "variant_id": "C2_I1_V1", 
    "variant_name": "C2_I1_V1_ Name" 
    } 
] 
groupArrayMain(arr, "category_id", "item_id", "variant_id") 

मैं भी रूप में jsfiddle

संबंधित मुद्दे