JS如何快捷实现这类对象数据转换

举个栗子?:

// 原数据
const metaData = [
  {
    name: 'xiaobe',
    like: '唱歌',
    id: 1,
  },
  {
    name: 'Sam',
    like: '做饭',
    id: 2,
  },
  {
    name: 'xiaobe',
    like: '吉他',
    id: 3,
  },
  {
    name: 'Sam',
    like: '编程',
    id: 4,
  },
];

// 转换后的数据
const transFormData = {
  id: 'person',
  data: [
    {
      xiaobe: {
        id: 100,
        like: [
          {
            id: 1,
            item: '唱歌',
          },
          {
            id: 3,
            item: '吉他',
          },
        ],
      },
      Sam: {
        id: 101,
        like: [
          {
            id: 2,
            item: '做饭',
          },
          {
            id: 4,
            item: '编程',
          },
        ],
      },
    },
  ],
};

另外 如何校验data里重复的字段,例如xiaobe

谢谢!

阅读 2.1k
2 个回答
// 原数据
const metaData = [
    {
        name: 'xiaobe',
        like: '唱歌',
        id: 1,
    },
    {
        name: 'Sam',
        like: '做饭',
        id: 2,
    },
    {
        name: 'xiaobe',
        like: '吉他',
        id: 3,
    },
    {
        name: 'Sam',
        like: '编程',
        id: 4,
    },
];

// 根据名称进行分类
const person = {}
metaData.forEach((item) => {

    if (!person[item.name]) {
        person[item.name] = {
            id: Math.random(),      // 不太明白你的 100 和 101 怎么来的?自行修改
            like: []
        }
    }

    person[item.name]['like'].push({
        id: item.id,
        item: item.like
    })

})

const transFormData = {
    id: 'person',
    data: [person]
}

console.log(JSON.stringify(transFormData, null, 2))

打印值如下:

clipboard.png

给你一个参考:

const groupBy = (arr, fn) =>
  arr.map(typeof fn === 'function' ? fn : val => val[fn]).reduce((acc, val, i) => {
    acc[val] = (acc[val] || []).concat(arr[i]);
    return acc;
  }, {});
groupBy([6.1, 4.2, 6.3], Math.floor); // {4: [4.2], 6: [6.1, 6.3]}
groupBy(['one', 'two', 'three'], 'length'); // {3: ['one', 'two'], 5: ['three']}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题