Javascript 将对象数组转换为具有lodash值的分组对象
我正在寻找一个紧凑的lodash解决方案,以获取一个对象数组,然后使用数组中对象的键和每个键的唯一值创建一个新对象Javascript 将对象数组转换为具有lodash值的分组对象,javascript,lodash,Javascript,Lodash,我正在寻找一个紧凑的lodash解决方案,以获取一个对象数组,然后使用数组中对象的键和每个键的唯一值创建一个新对象 [ { color: "black", type: "bag", }, { color: "red", type: "pants", }, { color: "black", type: "jacket", }, ] 期望输出: {
[
{
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)
非常漂亮和紧凑。我唯一看不到的是在我接受之前得到唯一的值:)我更新了问题来说明重复的值。非常好而且紧凑。我唯一看不到的是在接受之前获得唯一的值:)我更新了问题以说明重复的值。