Skip to content

Instantly share code, notes, and snippets.

@shiehnpin
Last active January 30, 2021 14:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shiehnpin/f6b423db7151b358d4c7461aa5d4a9d8 to your computer and use it in GitHub Desktop.
Save shiehnpin/f6b423db7151b358d4c7461aa5d4a9d8 to your computer and use it in GitHub Desktop.
//結果用Path存
//type階層, 數字越大越高層
const typeMap = {
commodity: 0,
product_cat_3: 1,
product_cat_2: 2,
product_cat_1: 3,
};
let idx = 0;
function parse(items, rootPath, result) {
//取得當前的這一個
let item = items[idx];
let itemPath = rootPath + "/" + item.type + "/" + item.name;
let itemType = item.type;
console.log("Current name", item.name);
console.log("Current type", itemType);
console.log("Current path", itemPath);
//加入結果
result.push({
name: item.name,
path: itemPath
});
//移動到下一個
idx++;
console.log("move to idx", idx);
if (typeMap[itemType] === typeMap.commodity) {
console.log("Add commodity ", itemPath);
//商品,回上一層
return;
} else {
console.log("Add category ", itemPath);
}
while (idx < items.length) {
//處理新的item
const nextItem = items[idx];
console.log(
"current",
item.name,
typeMap[itemType],
"vs. next",
nextItem.name,
typeMap[nextItem.type]
);
//如果新的item的階層比較高,返回上層
if (typeMap[nextItem.type] > typeMap[itemType]) {
return;
//如果新的item的階層一樣,則帶著目前item的父階層(root path)跳進去
} else if (typeMap[nextItem.type] === typeMap[itemType]) {
parse(items, rootPath, result);
} else {
//如果新的item的階層比較低,則帶著目前item的階層(item path)跳進去
console.log("======jump in to", item.name, "=====");
parse(items, itemPath, result);
console.log("======leave", item.name, "=====");
}
}
}
function _parse(items) {
const res = [];
parse(items, "", res);
console.log("=========");
for (let r of res) {
console.log(r.path);
}
}
const items = [
{
id: 103,
name: "A",
type: "product_cat_1",
note: "自有商品",
shops: [
{
id: "1000",
name: "台灣守護",
site_name: "台灣守護文創股份有公司",
sum: 0
},
{
id: "1100",
name: "總公司",
site_name: "總公司",
sum: 10
},
{
id: "1210",
name: "井仔腳",
site_name: "北門井仔腳",
sum: 41
},
{
id: "1220",
name: "出張所",
site_name: "夕遊出張所",
sum: 59
},
{
id: "1230",
name: "鹽博",
site_name: "台灣鹽博館",
sum: 135
},
{
id: "1231",
name: "遊客中心",
site_name: "七股遊客中心",
sum: 101
}
],
totalSum: 346
},
{
id: 124,
name: "24",
type: "product_cat_2",
note: "飲品類",
shops: [
{
id: "1000",
name: "台灣守護",
site_name: "台灣守護文創股份有公司",
sum: 0
},
{
id: "1100",
name: "總公司",
site_name: "總公司",
sum: 10
},
{
id: "1210",
name: "井仔腳",
site_name: "北門井仔腳",
sum: 41
},
{
id: "1220",
name: "出張所",
site_name: "夕遊出張所",
sum: 59
},
{
id: "1230",
name: "鹽博",
site_name: "台灣鹽博館",
sum: 135
},
{
id: "1231",
name: "遊客中心",
site_name: "七股遊客中心",
sum: 101
}
],
totalSum: 346
},
{
id: 150,
name: "102",
type: "product_cat_3",
note: "鹽鹵瓶裝水",
shops: [
{
id: "1000",
name: "台灣守護",
site_name: "台灣守護文創股份有公司",
sum: 0
},
{
id: "1100",
name: "總公司",
site_name: "總公司",
sum: 10
},
{
id: "1210",
name: "井仔腳",
site_name: "北門井仔腳",
sum: 41
},
{
id: "1220",
name: "出張所",
site_name: "夕遊出張所",
sum: 59
},
{
id: "1230",
name: "鹽博",
site_name: "台灣鹽博館",
sum: 135
},
{
id: "1231",
name: "遊客中心",
site_name: "七股遊客中心",
sum: 101
}
],
totalSum: 346
},
{
id: "A2410202",
name: "鹽鹵25海洋離子水500ml(箱)",
type: "commodity",
shops: [
{
id: "1000",
name: "台灣守護",
site_name: "台灣守護文創股份有公司",
sum: 0
},
{
id: "1100",
name: "總公司",
site_name: "總公司",
sum: 10
},
{
id: "1210",
name: "井仔腳",
site_name: "北門井仔腳",
sum: 0
},
{
id: "1220",
name: "出張所",
site_name: "夕遊出張所",
sum: 0
},
{
id: "1230",
name: "鹽博",
site_name: "台灣鹽博館",
sum: 2
},
{
id: "1231",
name: "遊客中心",
site_name: "七股遊客中心",
sum: 0
}
],
commodity_name: "鹽鹵25海洋離子水500ml(箱)",
product_cat_1_id: 103,
product_cat_2_id: 124,
product_cat_3_id: 150,
totalSum: 12
},
{
id: "A2410201",
name: "鹽鹵25海洋離子水500ml",
type: "commodity",
shops: [
{
id: "1000",
name: "台灣守護",
site_name: "台灣守護文創股份有公司",
sum: 0
},
{
id: "1100",
name: "總公司",
site_name: "總公司",
sum: 0
},
{
id: "1210",
name: "井仔腳",
site_name: "北門井仔腳",
sum: 41
},
{
id: "1220",
name: "出張所",
site_name: "夕遊出張所",
sum: 59
},
{
id: "1230",
name: "鹽博",
site_name: "台灣鹽博館",
sum: 133
},
{
id: "1231",
name: "遊客中心",
site_name: "七股遊客中心",
sum: 101
}
],
commodity_name: "鹽鹵25海洋離子水500ml",
product_cat_1_id: 103,
product_cat_2_id: 124,
product_cat_3_id: 150,
totalSum: 334
},
{
id: 109,
name: "G",
type: "product_cat_1",
note: "外購商品",
shops: [
{
id: "1000",
name: "台灣守護",
site_name: "台灣守護文創股份有公司",
sum: 0
},
{
id: "1100",
name: "總公司",
site_name: "總公司",
sum: 0
},
{
id: "1210",
name: "井仔腳",
site_name: "北門井仔腳",
sum: 0
},
{
id: "1220",
name: "出張所",
site_name: "夕遊出張所",
sum: 199
},
{
id: "1230",
name: "鹽博",
site_name: "台灣鹽博館",
sum: 324
},
{
id: "1231",
name: "遊客中心",
site_name: "七股遊客中心",
sum: 438
}
],
totalSum: 961
},
{
id: 124,
name: "24",
type: "product_cat_2",
note: "飲品類",
shops: [
{
id: "1000",
name: "台灣守護",
site_name: "台灣守護文創股份有公司",
sum: 0
},
{
id: "1100",
name: "總公司",
site_name: "總公司",
sum: 10
},
{
id: "1210",
name: "井仔腳",
site_name: "北門井仔腳",
sum: 41
},
{
id: "1220",
name: "出張所",
site_name: "夕遊出張所",
sum: 59
},
{
id: "1230",
name: "鹽博",
site_name: "台灣鹽博館",
sum: 135
},
{
id: "1231",
name: "遊客中心",
site_name: "七股遊客中心",
sum: 101
}
],
totalSum: 346
},
{
id: 166,
name: "801",
type: "product_cat_3",
note: "旺爺",
shops: [
{
id: "1000",
name: "台灣守護",
site_name: "台灣守護文創股份有公司",
sum: 0
},
{
id: "1100",
name: "總公司",
site_name: "總公司",
sum: 0
},
{
id: "1210",
name: "井仔腳",
site_name: "北門井仔腳",
sum: 0
},
{
id: "1220",
name: "出張所",
site_name: "夕遊出張所",
sum: 199
},
{
id: "1230",
name: "鹽博",
site_name: "台灣鹽博館",
sum: 324
},
{
id: "1231",
name: "遊客中心",
site_name: "七股遊客中心",
sum: 438
}
],
totalSum: 961
},
{
id: "G2480101",
name: "旺爺沙士",
type: "commodity",
shops: [
{
id: "1000",
name: "台灣守護",
site_name: "台灣守護文創股份有公司",
sum: 0
},
{
id: "1100",
name: "總公司",
site_name: "總公司",
sum: 0
},
{
id: "1210",
name: "井仔腳",
site_name: "北門井仔腳",
sum: 0
},
{
id: "1220",
name: "出張所",
site_name: "夕遊出張所",
sum: 199
},
{
id: "1230",
name: "鹽博",
site_name: "台灣鹽博館",
sum: 324
},
{
id: "1231",
name: "遊客中心",
site_name: "七股遊客中心",
sum: 438
}
],
commodity_name: "旺爺沙士",
product_cat_1_id: 109,
product_cat_2_id: 124,
product_cat_3_id: 166,
totalSum: 961
}
];
_parse(items);
//結果用巢狀存
const typeMap = {
commodity: 0,
product_cat_3: 1,
product_cat_2: 2,
product_cat_1: 3,
};
let idx = 0;
function parse(items, rootPath, result) {
//取得當前的這一個
let item = items[idx];
let itemPath = rootPath + "/" + item.type + "/" + item.name;
let itemType = item.type;
//加入結果
if(typeMap[itemType] === typeMap.commodity){
result.push(item);
}else{
item.childrens = [];
result.push(item);
}
idx++;
if (typeMap[itemType] === typeMap.commodity) {
return;
}
while (idx < items.length) {
const nextItem = items[idx];
if (typeMap[nextItem.type] > typeMap[itemType]) {
return;
} else if (typeMap[nextItem.type] === typeMap[itemType]) {
parse(items, rootPath, result);
} else {
parse(items, itemPath, item.childrens);
}
}
}
function _parse(items) {
const res = []
parse(items, "", res);
console.log(JSON.stringify(res, null, 2));
}
const items = [
{
id: 103,
name: "A",
type: "product_cat_1",
note: "自有商品",
shops: [
{
id: "1000",
name: "台灣守護",
site_name: "台灣守護文創股份有公司",
sum: 0
},
{
id: "1100",
name: "總公司",
site_name: "總公司",
sum: 10
},
{
id: "1210",
name: "井仔腳",
site_name: "北門井仔腳",
sum: 41
},
{
id: "1220",
name: "出張所",
site_name: "夕遊出張所",
sum: 59
},
{
id: "1230",
name: "鹽博",
site_name: "台灣鹽博館",
sum: 135
},
{
id: "1231",
name: "遊客中心",
site_name: "七股遊客中心",
sum: 101
}
],
totalSum: 346
},
{
id: 124,
name: "24",
type: "product_cat_2",
note: "飲品類",
shops: [
{
id: "1000",
name: "台灣守護",
site_name: "台灣守護文創股份有公司",
sum: 0
},
{
id: "1100",
name: "總公司",
site_name: "總公司",
sum: 10
},
{
id: "1210",
name: "井仔腳",
site_name: "北門井仔腳",
sum: 41
},
{
id: "1220",
name: "出張所",
site_name: "夕遊出張所",
sum: 59
},
{
id: "1230",
name: "鹽博",
site_name: "台灣鹽博館",
sum: 135
},
{
id: "1231",
name: "遊客中心",
site_name: "七股遊客中心",
sum: 101
}
],
totalSum: 346
},
{
id: 150,
name: "102",
type: "product_cat_3",
note: "鹽鹵瓶裝水",
shops: [
{
id: "1000",
name: "台灣守護",
site_name: "台灣守護文創股份有公司",
sum: 0
},
{
id: "1100",
name: "總公司",
site_name: "總公司",
sum: 10
},
{
id: "1210",
name: "井仔腳",
site_name: "北門井仔腳",
sum: 41
},
{
id: "1220",
name: "出張所",
site_name: "夕遊出張所",
sum: 59
},
{
id: "1230",
name: "鹽博",
site_name: "台灣鹽博館",
sum: 135
},
{
id: "1231",
name: "遊客中心",
site_name: "七股遊客中心",
sum: 101
}
],
totalSum: 346
},
{
id: "A2410202",
name: "鹽鹵25海洋離子水500ml(箱)",
type: "commodity",
shops: [
{
id: "1000",
name: "台灣守護",
site_name: "台灣守護文創股份有公司",
sum: 0
},
{
id: "1100",
name: "總公司",
site_name: "總公司",
sum: 10
},
{
id: "1210",
name: "井仔腳",
site_name: "北門井仔腳",
sum: 0
},
{
id: "1220",
name: "出張所",
site_name: "夕遊出張所",
sum: 0
},
{
id: "1230",
name: "鹽博",
site_name: "台灣鹽博館",
sum: 2
},
{
id: "1231",
name: "遊客中心",
site_name: "七股遊客中心",
sum: 0
}
],
commodity_name: "鹽鹵25海洋離子水500ml(箱)",
product_cat_1_id: 103,
product_cat_2_id: 124,
product_cat_3_id: 150,
totalSum: 12
},
{
id: "A2410201",
name: "鹽鹵25海洋離子水500ml",
type: "commodity",
shops: [
{
id: "1000",
name: "台灣守護",
site_name: "台灣守護文創股份有公司",
sum: 0
},
{
id: "1100",
name: "總公司",
site_name: "總公司",
sum: 0
},
{
id: "1210",
name: "井仔腳",
site_name: "北門井仔腳",
sum: 41
},
{
id: "1220",
name: "出張所",
site_name: "夕遊出張所",
sum: 59
},
{
id: "1230",
name: "鹽博",
site_name: "台灣鹽博館",
sum: 133
},
{
id: "1231",
name: "遊客中心",
site_name: "七股遊客中心",
sum: 101
}
],
commodity_name: "鹽鹵25海洋離子水500ml",
product_cat_1_id: 103,
product_cat_2_id: 124,
product_cat_3_id: 150,
totalSum: 334
},
{
id: 109,
name: "G",
type: "product_cat_1",
note: "外購商品",
shops: [
{
id: "1000",
name: "台灣守護",
site_name: "台灣守護文創股份有公司",
sum: 0
},
{
id: "1100",
name: "總公司",
site_name: "總公司",
sum: 0
},
{
id: "1210",
name: "井仔腳",
site_name: "北門井仔腳",
sum: 0
},
{
id: "1220",
name: "出張所",
site_name: "夕遊出張所",
sum: 199
},
{
id: "1230",
name: "鹽博",
site_name: "台灣鹽博館",
sum: 324
},
{
id: "1231",
name: "遊客中心",
site_name: "七股遊客中心",
sum: 438
}
],
totalSum: 961
},
{
id: 124,
name: "24",
type: "product_cat_2",
note: "飲品類",
shops: [
{
id: "1000",
name: "台灣守護",
site_name: "台灣守護文創股份有公司",
sum: 0
},
{
id: "1100",
name: "總公司",
site_name: "總公司",
sum: 10
},
{
id: "1210",
name: "井仔腳",
site_name: "北門井仔腳",
sum: 41
},
{
id: "1220",
name: "出張所",
site_name: "夕遊出張所",
sum: 59
},
{
id: "1230",
name: "鹽博",
site_name: "台灣鹽博館",
sum: 135
},
{
id: "1231",
name: "遊客中心",
site_name: "七股遊客中心",
sum: 101
}
],
totalSum: 346
},
{
id: 166,
name: "801",
type: "product_cat_3",
note: "旺爺",
shops: [
{
id: "1000",
name: "台灣守護",
site_name: "台灣守護文創股份有公司",
sum: 0
},
{
id: "1100",
name: "總公司",
site_name: "總公司",
sum: 0
},
{
id: "1210",
name: "井仔腳",
site_name: "北門井仔腳",
sum: 0
},
{
id: "1220",
name: "出張所",
site_name: "夕遊出張所",
sum: 199
},
{
id: "1230",
name: "鹽博",
site_name: "台灣鹽博館",
sum: 324
},
{
id: "1231",
name: "遊客中心",
site_name: "七股遊客中心",
sum: 438
}
],
totalSum: 961
},
{
id: "G2480101",
name: "旺爺沙士",
type: "commodity",
shops: [
{
id: "1000",
name: "台灣守護",
site_name: "台灣守護文創股份有公司",
sum: 0
},
{
id: "1100",
name: "總公司",
site_name: "總公司",
sum: 0
},
{
id: "1210",
name: "井仔腳",
site_name: "北門井仔腳",
sum: 0
},
{
id: "1220",
name: "出張所",
site_name: "夕遊出張所",
sum: 199
},
{
id: "1230",
name: "鹽博",
site_name: "台灣鹽博館",
sum: 324
},
{
id: "1231",
name: "遊客中心",
site_name: "七股遊客中心",
sum: 438
}
],
commodity_name: "旺爺沙士",
product_cat_1_id: 109,
product_cat_2_id: 124,
product_cat_3_id: 166,
totalSum: 961
}
];
_parse(items);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment