我具有此数据结构,并希望使用keyBy的lodash对其进行更改
[
{
names: [
{
id: 1,
name: 'aa',
},
{
id: 2,
name: 'bb',
},
],
date: '2020-11-02',
},
{
names: [
{
id: 3,
name: 'cc',
},
],
date: '2020-11-10',
},
]
并且想使用lodash对其进行更改,因此它只是对象的一个对象,其中每个名称都是一个以id为参考的对象。真的不在乎该日期是否已删除或不需要。它应该看起来像这样。
1: {
id: 1,
name: 'aa',
},
2: {
id: 2,
name: 'bb',
},
3:{
id: 3,
name: 'cc',
}
尝试这样做,但只会返回一个空对象
_.chain(array)
.keyBy('id')
.mapValues(function (item) {
item.name= _.keyBy(item.name, 'id')
return item
})
.value()
答案 0 :(得分:2)
这不使用lodash,但这很简单:
.flatMap(i => i.names)
.reduce((c, i) => {
c[i.id] = i;
return c;
}, {})
console.log([
{
names: [
{
id: 1,
name: 'aa',
},
{
id: 2,
name: 'bb',
},
],
date: '2020-11-02',
},
{
names: [
{
id: 3,
name: 'cc',
},
],
date: '2020-11-10',
},
].flatMap(i => i.names)
.reduce((c, i) => {
c[i.id] = i;
return c;
}, {}))
答案 1 :(得分:1)
使用lodash,您可以使用_.flatMap()
将名称转换为单个数组,然后使用_.keyBy()
转换为对象:
const arr = [{"names":[{"id":1,"name":"aa"},{"id":2,"name":"bb"}],"date":"2020-11-02"},{"names":[{"id":3,"name":"cc"}],"date":"2020-11-10"}]
const result = _.keyBy(
_.flatMap(arr, 'names'),
'id'
)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" crossorigin="anonymous"></script>