在javascript中将类似URL的数据解析为json

时间:2014-02-14 09:47:39

标签: javascript json

有人能告诉我如何将一组类似URL的数据解析为json吗?

对这种json的数组["a.b.c.d","a.c.e.f","a.b.c.g"]

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
                }
                ]
            }
            ]
        }
    ]
}

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以使用此演示。

只需删除不必要的格式;)并根据需要更改为局部变量。 我已经为你写了解析逻辑。

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

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