嵌套递归数组循环

时间:2016-02-19 03:49:44

标签: javascript recursion lodash

想知道是否有人知道如何使用lodash或vanilla JS来实现这个小问题?

我有这个起始对象:

{
  "1": {
    "null": {
      "2": {
        "3": {
          "6": {
            "7": "c"
          },
          "null": {
            "null": {
              "5": "b"
            }
          }
        }
      }
    }
  },
  "8": {
    "10": "e",
    "null": {
      "9": "d"
    }
  }
}

每个级别(水平)意味着什么。因此,级别1为type A,级别2为type B,3为type A,4为type B,依此类推。所以它交替出现。

是否有一种很好的,简单的方式来解决问题"这个对象看起来像这样:

[
  {
    "type": "A",
    "label": "1",
    "children": [
      {
        "type": "A",
        "label": "2",
        "children": [
          {
            "type": "B",
            "label": "3",
            "children": [
              {
                "type": "A",
                "label": "6",
                "children": [
                  {
                    "type": "A",
                    "label": "7",
                    "value": "c"
                  }
                ]
              },
              {
                "type": "A",
                "label": "8",
                "children": [
                  {
                    "type": "A",
                    "label": "5",
                    "value": "b"
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  },
  {
    "type": "A",
    "label": "8",
    "children": [
      {
        "type": "B",
        "label": "10",
        "value": "e"
      },
      {
        "type": "A",
        "label": "9",
        "value": "d"
      }
    ]
  }
]

本质上用它的类型注释每个级别,并嵌套它的子级。

3 个答案:

答案 0 :(得分:2)

这应该可以解决问题:

var source = {
  "1": {
    "null": {
      "2": {
        "3": {
          "6": {
            "7": "c"
          },
          "null": {
            "null": {
              "5": "b"
            }
          }
        }
      }
    }
  },
  "8": {
    "10": "e",
    "null": {
      "9": "d"
    }
  }
};



function collapse(obj, parent, level){
	var result = parent || [];
	level = level || 0;
	for(prop in obj){
		var item = obj[prop];
		var build = {
						type : level % 2 ? "B" : "A", 
						label : prop
						//, level : level 
					}
		if(typeof item == 'object'){
			build.children = [];
			collapse(item, build.children, level + 1);
		} else {
			build.value = item;
		}
		
		result.push(build);
	}
	return result;
}

var output = collapse(source);
var result = JSON.stringify(output, null, ' ');
console.log(result);

var elem = document.getElementById("result");
elem.innerHTML = result;
<pre id="result"></pre>

答案 1 :(得分:2)

这是代码

function transformObj(obj, level) {
  level = level || 1;
  var result = _(obj).transform(function(result, value, key) {
    var obj = {
      type: (level % 2 === 0) ? 'B' : 'A',
      label: key
    };
    if (key === 'null') {
      result.push(transformObj(value, level+1));
    } else {
      if (_.isObject(value)) {
        obj.children = transformObj(value, level+1);
      } else {
        obj.value = value;
      }
      result.push(obj);
    }
  }, [])
  .flatten()
  .value();
  return result;
}

这是输出

[
    {
        "type": "A",
        "label": "1",
        "children": [
            {
                "type": "A",
                "label": "2",
                "children": [
                    {
                        "type": "B",
                        "label": "3",
                        "children": [
                            {
                                "type": "A",
                                "label": "6",
                                "children": [
                                    {
                                        "type": "B",
                                        "label": "7",
                                        "value": "c"
                                    }
                                ]
                            },
                            {
                                "type": "A",
                                "label": "5",
                                "value": "b"
                            }
                        ]
                    }
                ]
            }
        ]
    },
    {
        "type": "A",
        "label": "8",
        "children": [
            {
                "type": "B",
                "label": "10",
                "value": "e"
            },
            {
                "type": "A",
                "label": "9",
                "value": "d"
            }
        ]
    }
]

答案 2 :(得分:1)

function doIt(data){
    return _.chain(data)
    .transform(function(result, value, key){
        if(key !== 'null'){
            var type = _.parseInt(key) % 2 === 1 ? 'A' : 'B';
            if(_.isObject(value) && !_.includes(_.keys(value), 'prop1')){
                result.push({
                    type: type,
                    label: key,
                    children: doIt(value)
                });
            } else {
                result.push({
                    type: type,
                    label: key,
                    value: value
                });
            }
        } else {
            if(_.isObject(value)){
                result.push(doIt(value));
            }
        }
    }, [])
    .flatten()
    .value();
}
var result = doIt(data);

结果是

[
{
    "type": "A",
    "label": "1",
    "children": [
        {
            "type": "B",
            "label": "2",
            "children": [
                {
                    "type": "A",
                    "label": "3",
                    "children": [
                        {
                            "type": "B",
                            "label": "6",
                            "children": [
                                {
                                    "type": "A",
                                    "label": "7",
                                    "value": "c"
                                }
                            ]
                        },
                        {
                            "type": "A",
                            "label": "5",
                            "value": "b"
                        }
                    ]
                }
            ]
        }
    ]
},
{
    "type": "B",
    "label": "8",
    "children": [
        {
            "type": "B",
            "label": "10",
            "value": "e"
        },
        {
            "type": "A",
            "label": "9",
            "value": "d"
        }
    ]
}
]