代码之家  ›  专栏  ›  技术社区  ›  Schotime

在javascript中创建嵌套对象,如C中的groupby#

  •  4
  • Schotime  · 技术社区  · 17 年前
    IList<Customer> Customers =
                flat.GroupBy(cust => new { cust.ReferenceNumber, cust.Name, cust.Address })
                    .Select(c => new Customer()
                    {
                        ReferenceNumber = c.Key.ReferenceNumber,
                        Name = c.Key.Name,
                        Address = c.Key.Address,
                        Orders = c.Select(o => new Order()
                        {
                            OrderId = o.OrderId,
                            ProductName = o.ProductName,
                            Description = o.Description,
                            Amount = o.Amount
                        }).ToList()
                    }).ToList()
    

    在Javascript中,获取平面列表并将其转换为嵌套对象是否可行? 一个通用的解决方案是??

    2 回复  |  直到 17 年前
        1
  •  17
  •   Jerther Horas    11 年前

    尽管这是一个老问题,但我认为我应该提供一个更优雅的解决方案:

    /**
     * Groups an array of objects by one or more keys
     * 
     * @param array arr       The array of objects to group
     * 
     * @param string|function A string representing the child property to group by
     *                        or a function that returns an array of one or more properties.
     * 
     * @returns               An object with keys representing the grouping properties, 
     *                        finally holding an array of records that fell into 
     *                        those groups.
     */
    var group = function( items, by ) {
        var groups = {},
            group,
            values,
            i = items.length,
            j,
            key,
            group_keys;
    
        // make sure we specified how we want it grouped
        if( !by ) { return items; }
        while( i-- ) { 
    
            // find out group values for this item
            values = ( typeof(by) === "function" && by( items[i] ) || 
                       typeof items[i] === "object" && items[i][by] || 
                       items[i] );
    
            // make sure our group values are an array
            values = values instanceof Array && values || [ values ];
    
            // recursively group
            group = groups;
            for( j = 0; j < values.length; j++ ) {
                key = values[j];
                group = ( group [key] || ( group [key] = j === values.length - 1 && [] || {} ) );
            }
    
            // for the last group, push the actual item onto the array
            group = ( group instanceof Array && group || [] ).push( items[i] );
        }
    
        return groups;
    };
    

    用这个称呼它:

    var items = [
        { "id" : 1, "name" : "foo",  "category" : "a" },
        { "id" : 2, "name" : "foo",  "category" : "a" },
        { "id" : 3, "name" : "bar",  "category" : "b" },
        { "id" : 4, "name" : "free", "category" : "a" },
        { "id" : 5, "name" : "beer", "category" : "b" },
        { "id" : 6, "name" : "foo",  "category" : "b" }
    ];
    
    var groups = group( items, function( item ) { return [ item.category, item.name ]; } );
    

    {
        b: {
            foo: [
                {
                    id: 6
                    name: foo
                    category: b
                }
            ]
            beer: [
                {
                    id: 5
                    name: beer
                    category: b
                }
            ]
            bar: [
                {
                    id: 3
                    name: bar
                    category: b
                }
            ]
        }
        a: {
            free: [
                {
                    id: 4
                    name: free
                    category: a
                }
            ]
            foo: [
                {
                    id: 2
                    name: foo
                    category: a
                }
                {
                    id: 1
                    name: foo
                    category: a
                }
            ]
        }
    }
    

    不管怎样,希望这能帮助别人。

        2
  •  2
  •   John Fisher    17 年前

    对

    $('div.several').each(function() { 
      // Do something with the current div.
    });
    

    您还可以非常轻松地创建嵌套对象:

    var outer = {
        inner1: {
            val1: 'a',
            val2: 'b'
        },
        inner2: {
            val1: 'c',
            val2: 'd'
        }
    };
    

    当然,您可以动态地执行此操作,而不是一次完成所有操作:

    var outer = {};
    outer.inner1 = {};
    outer.inner1.val1 = 'a';
    ...
    

    var result = [];
    for (var i=0; i<x; ++i) {
      result[result.length] = GetIndividualResult(i);
    }