首页 > 解决方案 > 如何将具有相似键/值的数组中的对象转换为该数组中的数组

问题描述

我目前有一个对象数组,其中一些具有重复的键值,特别是本示例中的国家/地区键。我正在尝试将该数组中具有相同国家/地区值的所有对象加入该对象数组本身的数组中。

const objects = [
  { name: 'name1', url: 'name1.com', country: 'IT' },
  { name: 'name2', url: 'name2.com', country: 'IT' },
  { name: 'name3', url: 'name3.com', country: 'IT' },
  { name: 'name4', url: 'name4.com', country: 'IT' },
  { name: 'name5', url: 'name5.com', country: 'IT' },

  { name: 'name6', url: 'name6.com', country: 'CN' },
  { name: 'name7', url: 'name7.com', country: 'CN' },
  { name: 'name8', url: 'name8.com', country: 'CN' },

  { name: 'name9', url: 'name9.com', country: 'AL' },

  { name: 'name10', url: 'name10.com', country: 'CZ' },
  { name: 'name11', url: 'name11.com', country: 'CZ' },

  { name: 'name12', url: 'name12.com', country: 'GB' },
  { name: 'name13', url: 'name13.com', country: 'GB' },
  { name: 'name14', url: 'name14.com', country: 'GB' },
  { name: 'name15', url: 'name15.com', country: 'GB' },

  { name: 'name16', url: 'name16.com', country: 'TR' },
  { name: 'name17', url: 'name17.com', country: 'MN' },
];

所以理想情况下,我希望上面的对象数组看起来像这样,其中类似的对象被分组到该数组内的一个数组中,包括没有重复国家的对象,我也希望它们在自己的数组中:

const newArrayofArrayofObjects = [
  [
    { name: 'name1', url: 'name1.com', country: 'IT' },
    { name: 'name2', url: 'name2.com', country: 'IT' },
    { name: 'name3', url: 'name3.com', country: 'IT' },
    { name: 'name4', url: 'name4.com', country: 'IT' },
    { name: 'name5', url: 'name5.com', country: 'IT' }
  ],
  [
    { name: 'name6', url: 'name6.com', country: 'CN' },
    { name: 'name7', url: 'name7.com', country: 'CN' },
    { name: 'name8', url: 'name8.com', country: 'CN' }
  ],
  [{ name: 'name9', url: 'name9.com', country: 'AL' }],
  [
    { name: 'name10', url: 'name10.com', country: 'CZ' },
    { name: 'name11', url: 'name11.com', country: 'CZ' }
  ],
  [
    { name: 'name12', url: 'name12.com', country: 'GB' },
    { name: 'name13', url: 'name13.com', country: 'GB' },
    { name: 'name14', url: 'name14.com', country: 'GB' },
    { name: 'name15', url: 'name15.com', country: 'GB' }
  ],
  [{ name: 'name16', url: 'name16.com', country: 'TR' }],
  [{ name: 'name17', url: 'name17.com', country: 'MN' }]
];

我试图用以下代码实现我想要的:

let newObjects= [];

Object.entries(objects).forEach(([key, value]) => {

    for (let i=0; i < objects.length; i++){
        newObjects.push([{ name: value.name, url: value.url, country: value.country}])
    }

});

没有完全达到我想要的,任何帮助表示赞赏。

标签: javascriptarraysecmascript-6javascript-objectshigher-order-functions

解决方案


您可以将对象与相同组的对象分组。

const
    objects = [{ name: 'name1', url: 'name1.com', country: 'IT' }, { name: 'name2', url: 'name2.com', country: 'IT' }, { name: 'name3', url: 'name3.com', country: 'IT' }, { name: 'name4', url: 'name4.com', country: 'IT' }, { name: 'name5', url: 'name5.com', country: 'IT' }, { name: 'name6', url: 'name6.com', country: 'CN' }, { name: 'name7', url: 'name7.com', country: 'CN' }, { name: 'name8', url: 'name8.com', country: 'CN' }, { name: 'name9', url: 'name9.com', country: 'AL' }, { name: 'name10', url: 'name10.com', country: 'CZ' }, { name: 'name11', url: 'name11.com', country: 'CZ' }, { name: 'name12', url: 'name12.com', country: 'GB' }, { name: 'name13', url: 'name13.com', country: 'GB' }, { name: 'name14', url: 'name14.com', country: 'GB' }, { name: 'name15', url: 'name15.com', country: 'GB' }, { name: 'name16', url: 'name16.com', country: 'TR' }, { name: 'name17', url: 'name17.com', country: 'MN' }],
    grouped = Object.values(objects.reduce((r, o) => {
        (r[o.country] ??= []).push(o);
        return r;
    }, {}));

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

通过按 对数据进行排序country,或者至少将所有相同的国家/地区分组在一起,您可以检查前任并创建一个新组。

const
    objects = [{ name: 'name1', url: 'name1.com', country: 'IT' }, { name: 'name2', url: 'name2.com', country: 'IT' }, { name: 'name3', url: 'name3.com', country: 'IT' }, { name: 'name4', url: 'name4.com', country: 'IT' }, { name: 'name5', url: 'name5.com', country: 'IT' }, { name: 'name6', url: 'name6.com', country: 'CN' }, { name: 'name7', url: 'name7.com', country: 'CN' }, { name: 'name8', url: 'name8.com', country: 'CN' }, { name: 'name9', url: 'name9.com', country: 'AL' }, { name: 'name10', url: 'name10.com', country: 'CZ' }, { name: 'name11', url: 'name11.com', country: 'CZ' }, { name: 'name12', url: 'name12.com', country: 'GB' }, { name: 'name13', url: 'name13.com', country: 'GB' }, { name: 'name14', url: 'name14.com', country: 'GB' }, { name: 'name15', url: 'name15.com', country: 'GB' }, { name: 'name16', url: 'name16.com', country: 'TR' }, { name: 'name17', url: 'name17.com', country: 'MN' }],
    grouped = objects.reduce((r, o, i, a) => {
        if (!i || a[i -1].country !== o.country) r.push([]);
        r[r.length - 1].push(o);
        return r;
    }, []);

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }


推荐阅读