通过对象键将对象的键数组嵌套在另一个数组内的另一个对象中?

时间:2020-11-11 20:51:46

标签: javascript reactjs react-native lodash

我具有此数据结构,并希望使用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()

2 个答案:

答案 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>