对象的组数组由多个键

发布于 2025-02-13 03:00:00 字数 2409 浏览 2 评论 0 原文

我是编程的新手,所以我需要一些帮助。 我有各种各样的对象。我需要对其进行排序,然后将其变成一系列物体,这些物体将包含关键城市,然后是领导者的一系列物体和一系列咖啡店。

  let arr = [
    {city: 'New York', boss: 'John', name: 'Caffe 1'},
    {city: 'New York', boss: 'John', name: 'Caffe 2'},
    {city: 'New York', boss: 'Ben', name: 'Caffe 3'},
    {city: 'New York', boss: 'Ben', name: 'Caffe 4'},
    {city: 'Washington', boss: 'Lisa', name: 'Caffe 5'},
    {city: 'Washington', boss: 'Lisa', name: 'Caffe 6'},
    {city: 'Washington', boss: 'Kate', name: 'Caffe 7'},
    {city: 'Washington', boss: 'Kate', name: 'Caffe 8'},
    {city: 'Los Angeles', boss: 'Joe', name: 'Caffe 9'}

  ]

我需要得到这样的东西。

    let result =  [
      {city: 'New York', 
      boss:[
        {
          name: 'John', 
          caffes:[
            {name: 'Caffe 1'},
            {name: 'Caffe 2'}
                  ]
                },
        {name: 'Ben', 
          caffes: [
            {name: 'Caffe 3'},
            {name: 'Caffe 4'}
                  ]
                }     
            ]
      },
      {city: 'Washington', 
      boss:[
        {
          name: 'Lisa', 
          caffes:[
            {name: 'Caffe 5'},
            {name: 'Caffe 6'}
                  ]
                },
        {name: 'Kate', 
          caffes: [
            {name: 'Caffe 7'},
            {name: 'Caffe 8'}
                  ]
                }     
            ]
      },
      {city: 'Los Angeles', 
      boss:[
        {
          name: 'Joe', 
          caffes:[
            {name: 'Caffe 9'},
                  ]
                },
            ]
      },
      ]

我能做的最好的事情就是:

    function sortData(data) {
    let groups = []; 

    for (let element of data) {
        let existingGroups = groups.filter((group) => group.city == element.city); 
        if (existingGroups.length > 0) {
            existingGroups[0].city = element.city;
            existingGroups[0].boss =  element.boss;

        } else {
            let newGroup = {
                city: element.city,
        boss: element.boss

            };
            groups.push(newGroup); 
        }
    }
    return groups; 
}

它使得:

[ { city: 'New York', boss: 'Ben' },
  { city: 'Washington', boss: 'Kate' },
  { city: 'Los Angeles', boss: 'Joe' } ]

但是我不知道如何使其更加复杂。

我尝试了多种方式,但是他们中的任何一个都无法帮助我。 我该怎么做?

I'm newbie in programming, so i need some help.
I have array of objects. I need to sort it and turn it into an array of objects, which will contain the key city, then an array of objects from the leaders, and an array of coffee shops.

  let arr = [
    {city: 'New York', boss: 'John', name: 'Caffe 1'},
    {city: 'New York', boss: 'John', name: 'Caffe 2'},
    {city: 'New York', boss: 'Ben', name: 'Caffe 3'},
    {city: 'New York', boss: 'Ben', name: 'Caffe 4'},
    {city: 'Washington', boss: 'Lisa', name: 'Caffe 5'},
    {city: 'Washington', boss: 'Lisa', name: 'Caffe 6'},
    {city: 'Washington', boss: 'Kate', name: 'Caffe 7'},
    {city: 'Washington', boss: 'Kate', name: 'Caffe 8'},
    {city: 'Los Angeles', boss: 'Joe', name: 'Caffe 9'}

  ]

I need to get something like this.

    let result =  [
      {city: 'New York', 
      boss:[
        {
          name: 'John', 
          caffes:[
            {name: 'Caffe 1'},
            {name: 'Caffe 2'}
                  ]
                },
        {name: 'Ben', 
          caffes: [
            {name: 'Caffe 3'},
            {name: 'Caffe 4'}
                  ]
                }     
            ]
      },
      {city: 'Washington', 
      boss:[
        {
          name: 'Lisa', 
          caffes:[
            {name: 'Caffe 5'},
            {name: 'Caffe 6'}
                  ]
                },
        {name: 'Kate', 
          caffes: [
            {name: 'Caffe 7'},
            {name: 'Caffe 8'}
                  ]
                }     
            ]
      },
      {city: 'Los Angeles', 
      boss:[
        {
          name: 'Joe', 
          caffes:[
            {name: 'Caffe 9'},
                  ]
                },
            ]
      },
      ]

The best what i can do is this:

    function sortData(data) {
    let groups = []; 

    for (let element of data) {
        let existingGroups = groups.filter((group) => group.city == element.city); 
        if (existingGroups.length > 0) {
            existingGroups[0].city = element.city;
            existingGroups[0].boss =  element.boss;

        } else {
            let newGroup = {
                city: element.city,
        boss: element.boss

            };
            groups.push(newGroup); 
        }
    }
    return groups; 
}

And its makes the:

[ { city: 'New York', boss: 'Ben' },
  { city: 'Washington', boss: 'Kate' },
  { city: 'Los Angeles', boss: 'Joe' } ]

But i dont know how to make it more complex.

I trying many ways, but any of them can't help me.
How can i do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

永不分离 2025-02-20 03:00:00

的确,这是一个非常直接的“群体”,就像在此重复我如何按键对象数组?。但是您的数据需要在第一个分组中通过 boss city 中进行另一个级别的分组。

这是一个示例分组到对象中,迭代a 循环然后使用 nofollow noreferrer“>逻辑无效nullish nullish nullish tossment(?? =?=) 。首先,对于 city ,然后对 city.boss 再次完成。最后,我们将” value() 结果作为结果,并映射它,以便也转换每个 boss 对一个值数组对象。

let arr = [{ city: 'New York', boss: 'John', name: 'Caffe 1' }, { city: 'New York', boss: 'John', name: 'Caffe 2' }, { city: 'New York', boss: 'Ben', name: 'Caffe 3' }, { city: 'New York', boss: 'Ben', name: 'Caffe 4' }, { city: 'Washington', boss: 'Lisa', name: 'Caffe 5' }, { city: 'Washington', boss: 'Lisa', name: 'Caffe 6' }, { city: 'Washington', boss: 'Kate', name: 'Caffe 7' }, { city: 'Washington', boss: 'Kate', name: 'Caffe 8' }, { city: 'Los Angeles', boss: 'Joe', name: 'Caffe 9' }]

const groupedByCity = {};

for (const { city, boss, name } of arr) {
  const cityGroup = (groupedByCity[city] ??= { city, boss: {} });
  const bossGroup = (cityGroup.boss[boss] ??= { name: boss, caffes: [] });

  bossGroup.caffes.push({ name })
}

const result = Object.values(groupedByCity)
  .map(o => ({ ...o, boss: Object.values(o.boss) }));

console.log(result)

It's true that this is at its heart a very straight forward 'group by' as in this duplicate How can I group an array of objects by key?. But your data requires another level of grouping by boss within the first grouping by city.

Here's an example grouping into an object, iterating each element in a for...of loop then retrieving or creating the relevant properties using logical nullish assignment (??=). This is done first for the city and then again for the city.boss. Finally the we take the Object.values() of the grouped object as the result, and map over it in order to also convert each boss object to a an array of values.

let arr = [{ city: 'New York', boss: 'John', name: 'Caffe 1' }, { city: 'New York', boss: 'John', name: 'Caffe 2' }, { city: 'New York', boss: 'Ben', name: 'Caffe 3' }, { city: 'New York', boss: 'Ben', name: 'Caffe 4' }, { city: 'Washington', boss: 'Lisa', name: 'Caffe 5' }, { city: 'Washington', boss: 'Lisa', name: 'Caffe 6' }, { city: 'Washington', boss: 'Kate', name: 'Caffe 7' }, { city: 'Washington', boss: 'Kate', name: 'Caffe 8' }, { city: 'Los Angeles', boss: 'Joe', name: 'Caffe 9' }]

const groupedByCity = {};

for (const { city, boss, name } of arr) {
  const cityGroup = (groupedByCity[city] ??= { city, boss: {} });
  const bossGroup = (cityGroup.boss[boss] ??= { name: boss, caffes: [] });

  bossGroup.caffes.push({ name })
}

const result = Object.values(groupedByCity)
  .map(o => ({ ...o, boss: Object.values(o.boss) }));

console.log(result)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文