2014-02-14 27 views
1

任何人都可以告訴我如何解析一個類似於URL的數據到json的數組嗎?在JavaScript中將類似於URL的數據解析爲json

陣列["a.b.c.d","a.c.e.f","a.b.c.g"]這類JSON的:

items:{ 
    text: "a", 
    items:[ 
     { 
      text:"b", 
      items:[ 
      { 
       text:"c", 
       items:[ 
       { 
        text:"d", 
        leaf:true 
       }, 
       { 
        text:"g", 
        leaf:true 
       } 
       ] 

      } 
      ] 
     }, 
     { 
      text:"c", 
      items:[ 
      { 
       text:"e", 
       items:[ 
       { 
        text:"f", 
        leaf:true 
       } 
       ] 
      } 
      ] 
     } 
    ] 
} 

回答

0

下面應該工作:

// ['a', 'b'] -> { text: 'a', items: [{ text: 'b', leaf: true }] } 
function buildTree(components) { 
    if (components.length === 0) { 
    throw new Error('Can\'t parse: empty components'); 
    } else if (components.length === 1) { 
    return { text: components[0], leaf: true }; 
    } else { 
    return { 
     text: components[0], 
     items: [buildTree(components.slice(1))] 
    } 
    } 
} 

// 'a.b' -> { text: 'a', items: [{ text: 'b', leaf: true }] } 
function parseString(str) { 
    return buildTree(str.split('.')); 
} 

// Merge nodes with a same text. 
function mergeSame(left, right) { 
    if (left.text !== right.text) { 
    throw new Error('Can\'t merge: different text ' + left.text + ', ' + right.text); 
    } 

    // Same text 
    if (left.leaf && right.leaf) { 
    return left; 
    } else if (left.leaf && !right.leaf) { 
    return right; 
    } else if (!left.leat && right.leaf) { 
    return left; 
    } else { 
    var concat = left.items.concat(right.items); 
    return { text: left.text, items: merge(concat) }; 
    } 
} 

// Merge multiple nodes. 
function merge(items) { 
    var textToItem = {}; 
    var keys = []; 
    for (var i = 0; i < items.length; i++) { 
    var text = items[i].text; 
    if (textToItem[text]) { 
     textToItem[text] = mergeSame(textToItem[text], items[i]); 
    } else { 
     textToItem[text] = items[i]; 
     keys.push(text); 
    } 
    } 
    keys.sort(); 
    var merged = []; 
    for (i = 0; i < keys.length; i++) { 
    merged.push(textToItem[keys[i]]); 
    } 
    return merged; 
} 

function parse(strs) { 
    var nodes = []; 
    for (var i = 0; i < strs.length; i++) { 
    nodes.push(parseString(strs[i])); 
    } 
    return { items: merge(nodes) }; 
} 

console.log(parseString('a.b.c.d')); 

console.log(parse(["a.b.c.d","a.c.e.f","a.b.c.g"])); 

它可能看起來凌亂。我不確定你的環境,並沒有使用mapreduce

0

你可以使用這個演示。

只需刪除不必要的格式;)並根據需要更改爲局部變量。 我已經爲你編寫了解析邏輯。

function parceArrayToExtJSTreeNodes(arr) { 
    for(i in arr) { 
     addNodesToTree(arr[i].split('.')); 
    } 
    createExtJSString(root, 0, true); 
} 

http://jsfiddle.net/HxFL6/