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' })]
];
阅读 9.3k
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` 数组即可。
9 个回答
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 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' },
];

// 使用 reduce 方法将数据分组
const result = items.reduce((acc, item) => {
  // 遍历每个 key
  Object.keys(item).forEach(key => {
    if (!acc[key]) {
      acc[key] = [];
    }
    acc[key].push({ [key]: item[key] });
  });
  return acc;
}, {});

// 将结果转换为数组
const finalResult = Object.values(result);

console.log(finalResult);
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' },
];

// 获取所有对象的键
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' }]
]

要将对象中属性相同的项分别放入不同的数组,你可以使用JavaScript的reduce方法来遍历对象数组,并将每个属性对应的值收集到不同的数组中。以下是一个通用的解决方案,它不依赖于特定的属性名称(如idname),而是动态地处理对象中的所有属性:

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

function groupByKeys(arr) {
  // 创建一个空对象来存储每个属性的数组
  const grouped = {};

  // 遍历每个项
  arr.forEach(item => {
    // 遍历项中的每个属性
    for (let key in item) {
      // 如果属性在grouped对象中还没有数组,则初始化一个空数组
      if (!grouped[key]) {
        grouped[key] = [];
      }
      // 创建一个只包含当前属性的新对象,并添加到对应的数组中
      grouped[key].push({ [key]: item[key] });
    }
  });

  // 将grouped对象的值(即数组)收集到一个结果数组中
  const result = Object.values(grouped);

  return result;
}

const result = groupByKeys(items);
console.log(result);

这段代码首先定义了一个groupByKeys函数,它接受一个对象数组作为参数。函数内部,它使用一个grouped对象来存储每个属性对应的数组。对于输入数组中的每个对象,它遍历对象的每个属性,并根据属性名在grouped对象中初始化或更新数组。每个数组中的元素是一个只包含当前属性的新对象。

最后,使用Object.values方法从grouped对象中提取出所有的数组,并将它们作为结果返回。

运行这段代码,你将得到如下输出:

[
  [ { id: 1 }, { id: 2 }, { id: 3 } ],
  [ { name: 'fruits' }, { name: 'animals' }, { name: 'fruits' } ]
]

这个输出正是你所期望的,它将具有相同属性的项分别放入了不同的数组中。

function group(arr) {
    const ret = [];
    const cache = {};
    for (let i = 0; i < arr.length; ++i) {
        const item = arr[i];
        for (let key in item) {
            const obj = { [key]: item[key] };
            if (cache[key]) {
                cache[key].push(obj);
            } else {
                cache[key] = ret[ret.length] = [obj];
            }
        }
    }
    return ret;
}
console.log(group(items));
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏