首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Underscore.js从平面列表创建嵌套对象?

如何使用Underscore.js从平面列表创建嵌套对象?
EN

Stack Overflow用户
提问于 2014-11-11 09:25:07
回答 1查看 835关注 0票数 0

inputorder

代码语言:javascript
复制
input = [
    {
        "top": "peach", 
        "middle": "monkey",
        "bottom": "blue"
    },
    {
        "top": "peach", 
        "middle": "monkey",
        "bottom": "red"
    },
    {
        "top": "peach", 
        "middle": "cat",
        "bottom": "brown"
    },
    {
        "top": "peach", 
        "middle": "cat",
        "bottom": "black"
    },
    {
        "top": "peach", 
        "middle": "dog",
        "bottom": "purple"
    }
];

order = ["top", "middle", "bottom"];

生成“嵌套”output

代码语言:javascript
复制
output =     {
    "name": "peach",
    "children": [
        {
            "name": "monkey",
            "children": [
                { "name": "blue" },
                { "name": "red" }
            ]
        },
        {
            "name": "cat",
            "children": [
                { "name": "brown" },
                { "name": "black" }
            ]
        },
        {
            "name": "dog",
            "children": [
                { "name": "purple" }
            ]
        }
    ]
};

我知道这与_.groupBy()和使用递归有关,但我不能把我的头绕在它周围.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-11 10:51:22

这是一个递归解决方案,它对订单列表中的每个项目使用groupBy

代码语言:javascript
复制
var nestedGroup = function(list, order) {

    if( _.isEmpty(order)) return [];

    var groups = _.groupBy(list, _.first(order));

    return _.map(groups, function(children, key){
        var group = {
            name: key,
            children: nestedGroup(children, _.rest(order))
        };

        return _.isEmpty(group.children) ? _.omit(group, 'children') : group;
    });
}

var groups = nestedGroup(input, order);

代码语言:javascript
复制
angular.module('MyModule', [])

.controller('MyController', function( $scope ) {
  
	var input = [
	    {
	        "top": "peach", 
	        "middle": "monkey",
	        "bottom": "blue"
	    },
	    {
	        "top": "peach", 
	        "middle": "monkey",
	        "bottom": "red"
	    },
	    {
	        "top": "peach", 
	        "middle": "cat",
	        "bottom": "brown"
	    },
	    {
	        "top": "peach", 
	        "middle": "cat",
	        "bottom": "black"
	    },
	    {
	        "top": "peach", 
	        "middle": "dog",
	        "bottom": "purple"
	    }
	];

	var order = ["top", "middle", "bottom"];

	var nestedGroup = function(list, order) {

		if( _.isEmpty(order)) return [];

		var groups = _.groupBy(list, _.first(order));

		return _.map(groups, function(children, key){
			var group = {
				name: key,
				children: nestedGroup(children, _.rest(order))
			};

			return _.isEmpty(group.children) ? _.omit(group, 'children') : group;
		});
	}

	var groups = nestedGroup(input, order);
  
    $scope.groups = groups;
});
代码语言:javascript
复制
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.7.0/underscore-min.js"></script>

<div ng-app='MyModule' ng-controller='MyController'>
  <p>{{groups || json}}</p>
</div>

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26861471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档