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

javascript减少以生成数组组

  •  0
  • r3plica  · 技术社区  · 6 年前

    我有这个分组方法:

    function groupByRange(products) {
        products.sort((a, b) => {
            return a.rangeCode - b.rangeCode
        });
    
        let groups = products.reduce(function (accumulator, product) {
            (accumulator[product['rangeCode']] = accumulator[product['rangeCode']] || []).push(product);
            return accumulator;
        }, {});
    
        console.log(groups);
    
        return groups;
    }
    

    创建一个类似于此的对象:

    {
        TEST: [{...}],
        TEST2: [{...}]
    }
    

    我更愿意创造一个长长的线条:

    [{
        rangeCode: 'TEST',
        products: [{...}]
    },{
        rangeCode: 'TEST2',
        products: [{...}]
    }]
    

    我不明白 reduce 足以创建我的版本。能做到吗?如果不是,获取对象数组的最佳方法是什么?

    2 回复  |  直到 6 年前
        1
  •  0
  •   r3plica    6 年前

    我想我解决这个问题的方法是:

    function groupByRange(products) {
        products.sort((a, b) => {
            return a.rangeCode - b.rangeCode
        });
    
        let groups = products.reduce(function (accumulator, product) {
            let groups = accumulator.filter(item => item.rangeCode === product.rangeCode);
            let found = groups.length === 1;
            let group = found ? groups[0] : { rangeCode: product.rangeCode, products: []};
    
            group.products.push(product);
    
            if (!found) accumulator.push(group);
    
            return accumulator;
        }, []);
    
        console.log(groups);
    
        return groups;
    }
    

    希望这是最好的方法

        2
  •  0
  •   Eric Svitok    6 年前

    如何循环和添加累积的产品数组。

    let groups = [];
    products.forEach(prod => {
       let acc;
       if (groups.length > 0) {
         acc = groups[groups.length-1].products.concat(prod.products);
       }
       else { // first entry into groups
         acc = prod.products;
       }
       groups.push({rangeCode: prod.rangeCode, products: acc});
    }