js 如何将Key属性相同的放在同一个数组?

const items = [
  { id: 1, name: 'fruits' },
  { id: 2, name: 'animals' },
  { id: 3, name: 'fruits' },
];

说明:id和name是动态的,有可能后台返回的是age和school,不是固定id和name

想要的结果是;

result = [
  [{ id: 1 }, { id: 2 }, { id: 3 }],
  [({ name: 'fruits' }, { name: 'animals' }, { name: 'fruits' })]
];
阅读 819
avatarAI BotBETA
要将具有相同 `name` 属性的对象分组,但按照你的要求输出结构(虽然这种结构在实际应用中并不常见,因为第二个数组中的对象会重复 `name` 值而不是分组),我们可以使用以下 JavaScript 代码:

const items = [
{ id: 1, name: 'fruits' },
{ id: 2, name: 'animals' },
{ id: 3, name: 'fruits' },
];

const groupedById = items.map(item => ({ id: item.id }));
const groupedByName = items.map(item => ({ name: item.name }));

const result = [groupedById, groupedByName];

console.log(result);


然而,如果你的意图是按 `name` 属性分组并仅保留每个组的唯一 `name`,同时保留所有 `id`,一个更合理的输出结构可能是这样的:

const groupedByNameReasonable = items.reduce((acc, item) => {
const nameKey = item.name;
if (!acc[nameKey]) {

acc[nameKey] = { names: [item.name], ids: [item.id] };

} else {

acc[nameKey].ids.push(item.id);
// 注意:这里不添加重复的 name 到 names 数组

}
return acc;
}, {});

// 转换为所需的数组格式(尽管这种格式仍然不是最直观的分组表示)
const resultReasonable = Object.values(groupedByNameReasonable).map(group => {
return [{ names: group.names }, ...group.ids.map(id => ({ id }))];
});

// 但注意,上面的 resultReasonable 结构并不直接符合你的原始要求格式,
// 因为它试图在逻辑上更合理地处理分组(即不重复 name 并列出所有相关 id)。
// 如果严格按照你的要求,我们应该坚持使用最初的 groupedById 和 groupedByName。


对于你的具体需求(即使它可能导致数据冗余),直接使用最初的 `groupedById` 和 `groupedByName` 数组即可。
6 个回答

着急吃饭了要 格式没对齐

const items = [
                    { id: 1, name: 'fruits' },
                    { id: 2, name: 'animals' },
                    { id: 3, name: 'fruits' },
                ]
                const keys = Object.keys(items[0]);
                const result = keys.map(v => {
                    return items.map(val => {
                        return {
                            [v]: val[v]
                        }
                    })
                })
                console.log(result);
const items = [
  { id: 1, name: 'fruits' },
  { id: 1, name: 'fruits222' },
  { id: 2, name: 'animals' },
  { id: 3, name: 'fruits' },
];
const result = {}
items.forEach(item=>{
    if(!result[item.id]){
        result[item.id] = []
    }
    result[item.id].push(item)
})
//[
//  [{ id: 1, name: 'fruits' },{ id: 1, name: 'fruits222' }],
//  [{ id: 2, name: 'animals' }],
//  [{ id: 3, name: 'fruits' }]
//]
console.log(Object.values(result))
function transformArray(items) {
    if (!items || !items.length) return [[], []];
    
    // 获取对象的所有键
    const keys = Object.keys(items[0]);
    
    // 为每个键创建一个数组
    const result = keys.map(key => 
        items.map(item => ({ [key]: item[key] }))
    );
    
    return result;
}
const result = [
  items.map((item) => ({ id: item.id })), 
  items.map((item) => ({ name: item.name })),
];
const items = [
  { id: 1, name: 'fruits' },
  { id: 2, name: 'animals' },
  { id: 3, name: 'fruits' },
];
let map = items.reduce((acc,cur,idx)=>{
    Object.keys(cur).forEach(key=>{
        if(!acc[key]) {
            acc[key] = [];
        }
        acc[key].push({[key]: cur[key]})
    })
    return acc;
},{})
console.log(Object.values(map))

image.png

const items = [
  { id: 1, name: 'fruits' },
  { id: 2, name: 'animals' },
  { id: 3, name: 'fruits' },
];

// 获取所有对象的键
const keys = Object.keys(items[0]);

// 为每个键创建一个数组,并将具有相同属性值的对象放入同一个数组
const result = keys.map(key => {
  return items.map(item => ({ [key]: item[key] }));
});

console.log(result);


[
  [{ id: 1 }, { id: 2 }, { id: 3 }],
  [{ name: 'fruits' }, { name: 'animals' }, { name: 'fruits' }]
]
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏