2015-09-03 3 views
0

Я изо дня в день пытаюсь написать эффективный алгоритм из данных json, чтобы создать исходный объект для jqxtree. Данные я получаю в таком видеЗаполнение дерева jQuery с данными JSON

var data = [ 
{ 
    number: 1001, 
    title: "Toyota : Corolla : LE : 2014" 
}, { 
    number: 1002, 
    title: "Toyota : Corolla : Sports : 2015" 
}, { 
    number: 1003, 
    title: "Toyota : Corolla : LE : 2013" 
}, { 
    number: 1004, 
    title: "Toyota : Camry: LE : 2013" 
}] 

Теперь мне нужно создать исходный объект как

var source = [ 
    { label: "Toyota", 
items: [ 
    { label: "Corolla", 
    items : [{ label : "LE" 
     items : [{label : 2014} 
      {label : 2013}]}, 
     { label : "Sports" 
     items : [{label : 2015}]} ]}, 
    { label: "Camry", 
    items : [{ label : "LE" 
     items : {label : 2013}}]} 
] 
} 
]; 

Может кто-нибудь, пожалуйста, помогите мне с этим.

Благодаря

ответ

1
var data = [ 
    { 
    number: 1001, 
    title: "Toyota : Corolla : LE : 2014" 
    }, 
    { 
    number: 1002, 
    title: "Toyota : Corolla : Sports : 2015" 
    }, 
    { 
    number: 1003, 
    title: "Toyota : Corolla : LE : 2013" 
    }, 
    { 
    number: 1004, 
    title: "Toyota : Camry : LE : 2013" 
    } 
]; 


//---------------------------------------------------- 
function format(data){ 

    var result = []; 

    function recurse(items, depth, target){ 

     for (var i = 0; i < target.length; i++) { 

      if(target[i].label == items[depth]){ 
       depth++; 
       recurse(items, depth, target[i].items); 
       return; 
      } 
     }; 

     var newItem = { label: items[depth] }; 
     target.push(newItem); 
     depth++; 

     if(depth < items.length){ 
      recurse(items, depth, newItem.items = []); 
     }  
    } 

    data.forEach(function(item){ 
     recurse(item.title.split(" : "), 0, result); 
    }); 

    return result; 
} 

console.log(JSON.stringify(format(data), null, 2)); 

Выход:

[ 
    { 
    "label": "Toyota", 
    "items": [ 
     { 
     "label": "Corolla", 
     "items": [ 
      { 
      "label": "LE", 
      "items": [ 
       { 
       "label": "2014" 
       }, 
       { 
       "label": "2013" 
       } 
      ] 
      }, 
      { 
      "label": "Sports", 
      "items": [ 
       { 
       "label": "2015" 
       } 
      ] 
      } 
     ] 
     }, 
     { 
     "label": "Camry", 
     "items": [ 
      { 
      "label": "LE", 
      "items": [ 
       { 
       "label": "2013" 
       } 
      ] 
      } 
     ] 
     } 
    ] 
    } 
] 
+0

Можете ли вы прислать мне ссылку JSFiddle если вы выполнили его? – Anonymous

+0

Конечно, [здесь] (http://jsfiddle.net/cviejo/4ymLcqvw/). Кроме того, только что отредактированный имел одну ошибку. – cviejo

+0

Спасибо тонну @CViejo :) – Anonymous

0

Вы могли бы хотеть попробовать это. Ниже приведена ссылка на код для тестирования.

https://fiddle.jshell.net/8rqtxfyg/7/

Ниже приведен код:

var items = [{ 
    number: 1001, 
    title: "Toyota : Corolla : LE : 2014" 
}, { 
    number: 1002, 
    title: "Toyota : Corolla : Sports : 2015" 
}, { 
    number: 1003, 
    title: "Toyota : Corolla : LE : 2013" 
}, { 
    number: 1004, 
    title: "Toyota : Camry : LE : 2013" 
}]; 



console.log(JSON.stringify(parseTitle(items))); 


function parseTitle(items) { 
    var newItems = []; 

    for(var i in items) { 
     newItems = merge(newItems, mapper(items[i].title.split(":"))); 
    } 

    return newItems; 
} 


function mapper(titles) { 
    var item = {}; 

    item["label"] = titles.shift().replace(/^\s+|\s+$/g, ""); 
    if(titles.length > 0) { 
     item["items"] = []; 
     item["items"].push(mapper(titles)); 
    } 

    return item; 
} 

function merge(items, itemToMerge, parentItem) { 

    for(var i in items) { 
     if(items[i]["label"] == itemToMerge["label"]) { 
      if(items[i].hasOwnProperty("items") && itemToMerge.hasOwnProperty("items")) { 
       items[i].items = merge(items[i].items, itemToMerge.items[0], items[i]); 
      } else { 
       parentItem.items.push(itemToMerge); 
      } 

      return items; 
     } 
    } 

    items.push(itemToMerge); 

    return items; 
} 

Ниже Консоль вывода:

[{ 
    "label": "Toyota ", 
    "items": [{ 
     "label": " Corolla ", 
     "items": [{ 
      "label": " LE ", 
      "items": [{ 
       "label": " 2014" 
      }, { 
       "label": " 2013" 
      }] 
     }, { 
      "label": " Sports ", 
      "items": [{ 
       "label": " 2015" 
      }] 
     }] 
    }, { 
     "label": " Camry", 
     "items": [{ 
      "label": " LE ", 
      "items": [{ 
       "label": " 2013" 
      }] 
     }] 
    }] 
}] 
Смежные вопросы