首页 > 解决方案 > 将对象数组转换为具有 lodash 值的分组对象

问题描述

我正在寻找一个紧凑的 lodash 解决方案来获取对象数组,然后使用数组中对象的键和每个键的唯一值创建一个新对象。

[
    {
        color: "black",
        type: "bag",
    },
    {
        color: "red",
        type: "pants",
    },
    {
        color: "black",
        type: "jacket",
    },
]

期望的输出:

{
    color: ["black", "red"],
    type: ["bag", "pants", "jacket"],
}

谢谢!

标签: javascriptlodash

解决方案


您可以使用 iteratee 解决此lodash#flatMap问题lodash#toPairs,以创建键和值数组对的扁平化版本。lodash#groupBy与删除数组对的键的 iteratee 函数一起使用Array#shift,并将此类值用作集合的分组键。最后,与由和lodash#mapValues组成的迭代器一起使用,以展平数组并仅获取每个分组数组的唯一值。请注意,函数组合用于组合连续的函数参数以形成一个函数结果。lodash#flattenlodash#uniqlodash#flow

var result = _(array)
  .flatMap(_.toPairs)
  .groupBy(v => v.shift())
  .mapValues(_.flow(_.flatten, _.uniq))
  .value();

var array = [
    {
        color: "black",
        type: "bag",
    },
    {
        color: "red",
        type: "pants",
    },
    {
        color: "black",
        type: "jacket",
    }
];

var result = _(array)
  .flatMap(_.toPairs)
  .groupBy(v => v.shift())
  .mapValues(_.flow(_.flatten, _.uniq))
  .value();
  
console.log(result);
.as-console-wrapper{min-height:100%;top:0}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>


推荐阅读