从数组动态生成嵌套树对象

时间:2015-05-26 00:37:31

标签: javascript object tree

鉴于这两个字符串,

circle=false; function activateInView(){ if(circle==false){ if( $('#myStat4').offset().top > $(window).scrollTop() ){ $('#myStat4').circliful(); circle=true; // this is so it doesn't keep activating as you keep scrolling } } } $(document).ready(function(){ //This fires when everything is loaded activateInView(); //Test here in case it's already in view $(window).scroll(function(){ // This checks again everytime you scroll activateInView(); }); }); '1|100376|100377|100378'

我想创建一个如下所示的对象:

'1|100376|100377|100379|100380'

这是我的代码,

{
  id:"1",
  children: {
    id:"100376",
    children: {
      id:"100377",
      children: {
        id:"100378",
        children: {},
        id: "100379",
          children: {
            id:"100380",
            children: {}
        }
      }
    }
  }
}

这会生成正确的嵌套,但不会在键var tree = {}; var addTree = function(aggregateId){ if(aggregateId){ var arr = aggregateId.split('|'), remainder = aggregateId.split('|').slice(1).join('|'); arr.reduce(function(node,id){ return node[id] || (node[id] = {}); }, tree); } }; addTree('1|100376|100377|100378'); addTree('1|100376|100377|100379|100380'); id下生成。我该怎么做呢?

children

3 个答案:

答案 0 :(得分:1)

$ pip install sqlalchemy

但是,我认为您可能存在设计缺陷 - var tree = {}; var addTree = function(aggregateId) { if (aggregateId) { var arr = aggregateId.split('|'), arr.reduce(function(node, id) { if (!node.id) { node.id = id; node.children = {}; } return node.children; }, tree); } }; addTree('1|100376|100377|100378'); addTree('1|100376|100377|100379|100380'); console.log(JSON.stringify(tree)); // {"id":"1","children": // {"id":"100376","children": // {"id":"100377","children": // {"id":"100379","children": // {"id":"100380","children":{}}}}}} 只能容纳一个孩子。您确定不希望它是包含节点的数组,或者更好的是按照原始情况按键索引节点的对象吗?它适用于您的原始情况,因为您有从ids到儿童的映射;但在你提出的结构中,children总是只有一个孩子。

编辑以了解更改后的要求:由于children仍然无法正常使用,因此有点丑陋。可以使用Array.prototype.find作为黑客攻击,但效率很低。所以:

.filter()[0]

答案 1 :(得分:1)

你已经到了一半。您需要做的就是对输出进行后处理以创建所需的表单,这就像

一样简单
function makeTree(tree) {
  if (!tree) return [];
  return Object.keys(tree) . map(function(key) {
      return { id: key, children: makeTree(tree[key]) };
  });
}

这将输出一个结构,其中包含数组中的子项,如果有多个子项,则需要它,如另一张海报所指出的那样。输出是:

{
  id:"1",
  children: [
    {
      id:"100376",
      children: [
        {
          id:"100377",
          children: [
            {
              id:"100378", 
              children: []
            },
            {
              id: "100379",
              children: [
                {
                  id:"100380",
                  children: []
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

以下用于构建中间表示的代码可能比您所写的更简洁:

function addTree(tree, input) {

  function addNodes(node, ids) {
    if (!ids.length) return;                  // exit recursion when done
    var id = ids.shift();                     // pick off next id
    var subnode = node[id] = node[id] || { }; // find or create node
    addNodes(subnode, ids);                   // recursively update 
  }

  addNodes(tree, input.split('|'));
}

这种方法的工作方式是内部函数addNodes使用数组node中的ID更新ids。它检查以确保有更多的ID要添加,然后选择第一个,查看相应的节点是否已经存在,如果没有创建一个,则将该id添加到该子节点。

继续对要处理的所有字符串调用addTree。然后,进行后处理tree以获得最终输出。

使用此:

> var input1 = '1|100376|100377|100378';
> var input2 = '1|100376|100379|100380';
> var tree = {};

> addTree(tree, input1) // add initial input
> tree
<"{
    "1": {
      "100376": {
        "100377": {
          "100378": {}
        }
      }
    }
  }"

> addTree(tree, input2) // add some more input
> tree
< "{
    "1": {
      "100376": {
        "100377": {
          "100378": {}
        },
        "100379": {
          "100380": {}
        }
      }
    }
  }"

> makeTree(tree)
< "[
    {
      "id": "1",
      "children": [
        {
          "id": "100376",
          "children": [
            {
              "id": "100377",
              "children": [
                {
                  "id": "100378",
                  "children": []
                }
              ]
            },
            {
              "id": "100379",
              "children": [
                {
                  "id": "100380",
                  "children": []
                }
              ]
            }
          ]
        }
      ]
    }
  ]"

答案 2 :(得分:1)

您的问题描述中并不是很清楚。但是,如果您想要一种简单的方法来生成树,您只需要在管道字符(#include <string.h> void functionCopyData(char buf[]){ char data1[] = "textdata1"; char data2[] = "textdata2"; strcpy(buf, data1); strcpy(buf+strlen(buf), data2); } ... functionCopyData(variable); ... )处拆分字符串,然后向后读取数组。

如果您想拥有多个孩子,可以轻松调整下面的逻辑,使"|"成为一个数组。然后,您需要做的只是.children而不是o.children.push(p)

由于无法在JavaScript中进行右缩减,因此您可以先reversereduce之前{{3}}数组

o.children = p