Ключ Lodash по тем же свойствам, что и массивы - PullRequest
0 голосов
/ 04 мая 2018

У меня есть несколько объектов в массиве:

"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 Ответ

0 голосов
/ 04 мая 2018

Используйте _.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>
...