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

Lodash keyBy与数组具有相同的属性

  •  0
  • Halufolia  · 技术社区  · 7 年前

    阵列中有几个对象:

    "surcharges": [
        {
            "supplier": "XXXXX",
            "name": "over_pkg_0",
            "amount": 230
        },
        {
            "supplier": "XXXXX",
            "name": "over_pkg_1",
            "amount": 54
        },
        {
            "supplier": "YYYYY",
            "name": "over_pkg_0",
            "amount": 25
        },
        {
            "supplier": "YYYYY",
            "name": "over_pkg_1",
            "amount": 25
        }
    ];
    

    我希望使用lodash获得以下结果:

    "surcharges": [
        {
            "XXXXX": [
                {
                    "name": "over_pkg_0",
                    "amount": 230
                },
                {
                    "name": "over_pkg_1",
                    "amount": 54
                }
            ],
        },
        {
            "YYYYY": [
                {
                    "name": "over_pkg_0",
                    "amount": 25
                },
                {
                    "name": "over_pkg_1",
                    "amount": 25
                }
            ],
        }
    ];
    

    我可以生成类似的东西,但这些键正在合并,我无法将它们做成数组。也许我应该用 _.concat 在链条的某个地方,但我不知道怎么做。

    已尝试使用:

    var finalsurcharges = _.chain(surcharges)
      .keyBy('supplier')
      .mapValues(v => _.omit(v, 'supplier'))
      .value();
    

    产生:

    "finalsurcharges": {
        "XXXXX": {
            "name": "over_pkg_1",
            "amount": 54
        },
        "YYYYY": {
            "name": "over_pkg_1",
            "amount": 25
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Ori Drori    7 年前

    使用 _.groupBy() 要按键值对对象数组进行分组,请执行以下操作:

    const data = { surcharges: [{"supplier":"XXXXX","name":"over_pkg_0","amount":230},{"supplier":"XXXXX","name":"over_pkg_1","amount":54},{"supplier":"YYYYY","name":"over_pkg_0","amount":25},{"supplier":"YYYYY","name":"over_pkg_1","amount":25}]};
    
    const finalsurcharges = _(data.surcharges)
        .groupBy('supplier')
        .mapValues((g) => g.map(o => _.omit(o, 'supplier')))
        .value();
    
    console.log(finalsurcharges);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>