Javascript 如何通过键将数组转换为对象?

Javascript 如何通过键将数组转换为对象?,javascript,Javascript,假设我得到了这个数组: const users =[ { id:1, name:'bob', }, { id:2, name:'sally', }, { id:3, name:'bob', age:30, } ]; 我想使用任意键(在本例中为“name”)返回一个对象: { bob:[ { id:1,

假设我得到了这个数组:

const users =[ 
   { 
      id:1,
      name:'bob',

   },
   { 
      id:2,
      name:'sally',

   },
   { 
      id:3,
      name:'bob',
      age:30,

   }
];
我想使用任意键(在本例中为“name”)返回一个对象:

{ 
   bob:[ 
      { 
         id:1,
         name:'bob',

      },
      { 
         id:3,
         name:'bob',
         age:30,

      }
   ],
   sally:[ 
      { 
         id:2,
         name:'sally',

      }
   ],
}
我试过这个:

const go = (A,key) =>{
    return A.reduce((o, key) => ({ ...o, [key]:o }), {})
}

export default go;
但这也带来了:

{ '[object Object]': { '[object Object]': { '[object Object]': {} } } }

如果键不存在,则从结果中忽略。但它不应该改变原始数组。如何执行这种转换

使用您已有的方法,如果对象中还没有键,则不会实例化新数组

这将有助于:

const result = users.reduce((a, v) => {
  a[v.name] = a[v.name] || [];
  a[v.name].push(v);
  return a;
}, {});
将此逻辑包装到函数中的完整代码段:
const用户=[{
id:1,
姓名:'鲍勃',
}, {
id:2,
姓名:“莎莉”,
}, {
id:3,
姓名:'鲍勃',
年龄:30,,
}];
常量go=(输入,键)=>input.reduce((a,v)=>{
a[v[key]]=a[v[key]| |[];
a[v[键]。按(v);
返回a;
}, {});

log(go(users,'name'))
您很接近,但是本例中的
属性是每个值(例如:
{id:1,name:'bob'}
),因此字符串表示形式是
[object object]
,这就是为什么所有键都是这样的。根据您所说的,您希望使用
key.name
作为属性,并将其值设置为
[key]
。(在我的示例中,我将key重命名为
arr
,因为它是数组值)

所以这就像是
{…o,[arr.name]:[arr]}

因为可能存在一个现有值,所以它增加了一点复杂性,这正是
[…(obj[arr.name]| |[]),arr]
所做的。它查找现有的值(或默认为空数组),然后分散这些值并添加新值

const用户=[{
id:1,
姓名:'鲍勃',
},
{
id:2,
姓名:“莎莉”,
},
{
id:3,
姓名:'鲍勃',
年龄:30,,
}
];
常量转换=(输入,键名)=>{
返回输入.reduce((obj,arr)=>({…obj,
[arr[keyName]]:[…(obj[arr[keyName]]| |[]),arr]
}), {})
}
log(转换(用户,'name'))

log(transform(users,'id'))
这只适用于参数'name'。如果我输入参数“id”,则不需要。只需要将其包装到一个也接受属性名的函数中。我编辑了代码段以将逻辑包装到函数中。如果使用age参数,则返回未定义的数组。如何跳过未定义的对象?首先只筛选出属性设置为:
input.filter(v=>v.key!=null)的对象。reduce(…)
这仅适用于参数“name”。如果我输入参数'id',它就不存在了。@bierhier啊,我知道你现在想做什么了。知道了。我更新了答案以处理动态键。如果我使用“age”作为参数,我仍然会返回未定义的对象?因为
bob
sally
没有
age
。所以这两个都是未定义的。尝试将年龄添加到这两个选项中。我不想更改输入。