2015-03-05 19 views
5

Tôi có một cấu Json như dưới đâyNhóm Json Dựa trên Nhiều Phím

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

Tôi muốn nhóm Json để N' cấp trong javascript, nói bằng cách thông qua danh sách các phím. Ví dụ: cho category_id, item_id và variant_id, tôi hy vọng phản hồi sau đây:

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

Cần trợ giúp về cách thực hiện việc này?

Tôi đã thử một cái gì đó như sau, nhưng nó nhóm cho một cấp độ. Tôi muốn nó được đệ quy.

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

tôi đã cố gắng một cái gì đó như sau, nhưng nó nhóm cho một cấp, i muốn nó được đệ quy [code] function groupBy (collection, property) { var i = 0, val, index, giá trị = [], result = []; cho (; i -1) kết quả [chỉ mục] .push (bộ sưu tập [i]); else { values.push (val); result.push ([bộ sưu tập [i]]); } } kết quả trả về; } – Madhan

+0

bạn muốn chuyển danh sách các tên khóa hoặc giá trị? – user937284

+0

tên khóa (trong ví dụ trên, tôi cần chuyển category_id, item_id, variant_id làm danh sách – Madhan

Trả lời

0

Đây là giải pháp của tôi về nhiệm vụ (chỉ Javascript):

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

Tôi cũng đặt này như jsfiddle

Các vấn đề liên quan