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
。所以这两个都是未定义的。尝试将年龄添加到这两个选项中。我不想更改输入。