Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将对象数组转换为具有lodash值的分组对象_Javascript_Lodash - Fatal编程技术网

Javascript 将对象数组转换为具有lodash值的分组对象

Javascript 将对象数组转换为具有lodash值的分组对象,javascript,lodash,Javascript,Lodash,我正在寻找一个紧凑的lodash解决方案,以获取一个对象数组,然后使用数组中对象的键和每个键的唯一值创建一个新对象 [ { color: "black", type: "bag", }, { color: "red", type: "pants", }, { color: "black", type: "jacket", }, ] 期望输出: {

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

[
    {
        color: "black",
        type: "bag",
    },
    {
        color: "red",
        type: "pants",
    },
    {
        color: "black",
        type: "jacket",
    },
]
期望输出:

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

谢谢

我看不到一个函数能为您做到这一点,所以这里有一个解决方案,它只使用lodash函数,通过一些简单的步骤来解决这个问题

const listOfPairs = _.flatten(_.map(input, _.toPairs))
将对象列表转换为[键,值]对的列表

listOfPairs = [
  [ 'color', 'black' ],
  [ 'type', 'bag' ],
  [ 'color', 'red' ],
  [ 'type', 'pants' ] ]
现在,我们可以根据每对中第一个位置的值将它们分组

const indexByKeyToValues = _.toPairs(_.groupBy(listOfPairs, _.head))
这给了我们

indexByKeyToValues = [
  [ 'color', [ ['color', 'black'], ['color', 'red'] ] ],
  [ 'type', [ ['type', 'bag'], ['type', 'pants'] ] ] ]
然后,映射值数组以拾取最后一个元素(输入映射中的原始值)

就快到了

pairsOfKeyAndValue = [
  [ 'color', [ 'black', 'red' ] ],
  [ 'type', [ 'bag', 'pants' ] ] ]
我们只需要使用这些对重建一个对象

const result = _.fromPairs(pairsOfKeyAndValue)
在函数式编程中,实现这种处理的整个“将映射转换为成对序列或从成对序列转换映射”技巧非常常见。一旦你做到了这一点,找出剩下的步骤就不会太棘手了


希望这能为您提供一个在将来解决此类问题的总体思路。

我看不到一个函数可以为您实现这一点,因此这里有一个解决方案,它只使用lodash函数,通过一些简单的步骤来解决问题

const listOfPairs = _.flatten(_.map(input, _.toPairs))
将对象列表转换为[键,值]对的列表

listOfPairs = [
  [ 'color', 'black' ],
  [ 'type', 'bag' ],
  [ 'color', 'red' ],
  [ 'type', 'pants' ] ]
现在,我们可以根据每对中第一个位置的值将它们分组

const indexByKeyToValues = _.toPairs(_.groupBy(listOfPairs, _.head))
这给了我们

indexByKeyToValues = [
  [ 'color', [ ['color', 'black'], ['color', 'red'] ] ],
  [ 'type', [ ['type', 'bag'], ['type', 'pants'] ] ] ]
然后,映射值数组以拾取最后一个元素(输入映射中的原始值)

就快到了

pairsOfKeyAndValue = [
  [ 'color', [ 'black', 'red' ] ],
  [ 'type', [ 'bag', 'pants' ] ] ]
我们只需要使用这些对重建一个对象

const result = _.fromPairs(pairsOfKeyAndValue)
在函数式编程中,实现这种处理的整个“将映射转换为成对序列或从成对序列转换映射”技巧非常常见。一旦你做到了这一点,找出剩下的步骤就不会太棘手了

希望这能为您提供一个将来解决此类问题的一般思路。

您可以使用iteratee来解决此问题,以创建一对键和值数组的展开版本。与用于删除数组对的键的iteratee函数一起使用,并将该值用作集合的分组键。最后,与由和组成的iteratee一起使用,以展平数组并仅获取每个分组数组的唯一值。请注意,函数组合用于组合连续的函数参数以形成一个函数结果

var result = _(array)
  .flatMap(_.toPairs)
  .groupBy(v => v.shift())
  .mapValues(_.flow(_.flatten, _.uniq))
  .value();
var数组=[
{
颜色:“黑色”,
类型:“包”,
},
{
颜色:“红色”,
类型:“裤子”,
},
{
颜色:“黑色”,
类型:“夹克”,
}
];
变量结果=(数组)
.flatMap(u.toPairs)
.groupBy(v=>v.shift())
.mapValues(0.flow(0.flatten,0.uniq))
.value();
控制台日志(结果)
。作为控制台包装{最小高度:100%;顶部:0}
您可以使用iteratee解决此问题,以创建键和值数组对的展开版本。与用于删除数组对的键的iteratee函数一起使用,并将该值用作集合的分组键。最后,与由和组成的iteratee一起使用,以展平数组并仅获取每个分组数组的唯一值。请注意,函数组合用于组合连续的函数参数以形成一个函数结果

var result = _(array)
  .flatMap(_.toPairs)
  .groupBy(v => v.shift())
  .mapValues(_.flow(_.flatten, _.uniq))
  .value();
var数组=[
{
颜色:“黑色”,
类型:“包”,
},
{
颜色:“红色”,
类型:“裤子”,
},
{
颜色:“黑色”,
类型:“夹克”,
}
];
变量结果=(数组)
.flatMap(u.toPairs)
.groupBy(v=>v.shift())
.mapValues(0.flow(0.flatten,0.uniq))
.value();
控制台日志(结果)
。作为控制台包装{最小高度:100%;顶部:0}

使用内置功能。它更快,更短,更容易推理

const arr=[{color:“black”,type:“bag”,},{color:“red”,type:“pants”,},{color:“black”,type:“jacket”,}],
obj=arr.reduce((h,y)=>{
Object.keys(y).forEach(k=>{
如果(!h[k]){
h[k]=[]
h[k]。推送(y[k])
}else如果(!h[k].包括(y[k])h[k].推送(y[k])
})
返回h
}, {})

console.log(obj)
使用内置功能。它更快,更短,更容易推理

const arr=[{color:“black”,type:“bag”,},{color:“red”,type:“pants”,},{color:“black”,type:“jacket”,}],
obj=arr.reduce((h,y)=>{
Object.keys(y).forEach(k=>{
如果(!h[k]){
h[k]=[]
h[k]。推送(y[k])
}else如果(!h[k].包括(y[k])h[k].推送(y[k])
})
返回h
}, {})

console.log(obj)
非常漂亮和紧凑。我唯一看不到的是在我接受之前得到唯一的值:)我更新了问题来说明重复的值。非常好而且紧凑。我唯一看不到的是在接受之前获得唯一的值:)我更新了问题以说明重复的值。