javascript通过映射基于另一个对象更新对象键/值
我在某个对象上循环,并根据一些查找更新另一个对象的值,目前在映射中获取正确的值时遇到问题javascript通过映射基于另一个对象更新对象键/值,javascript,arrays,object,for-loop,ecmascript-6,Javascript,Arrays,Object,For Loop,Ecmascript 6,我在某个对象上循环,并根据一些查找更新另一个对象的值,目前在映射中获取正确的值时遇到问题 let users = [ { "id": "123", "email": "john.doe@acme.com", "name": " John Doe", "group": "1", "subgroup": "1" }, { "id": "456", "email": "tom.hans@stk.com", "name": "
let users = [
{
"id": "123",
"email": "john.doe@acme.com",
"name": " John Doe",
"group": "1",
"subgroup": "1"
},
{
"id": "456",
"email": "tom.hans@stk.com",
"name": " Tom hans",
"group": "2",
"subgroup": "1"
}
];
let groupData = [
{
id: "1",
name: "Stars",
subgroup: [
{
id: "1",
pseudo: "big"
},
{
id: "2",
pseudo: "small"
}
]
},
{
id: "2",
name: "Stones",
subgroup: [
{
id: "1",
pseudo: "tiny"
},
{
id: "2",
pseudo: "huge"
}
]
}
];
const allUsers = {};
for (var i = 0; i < users.length; i++) {
let groupID = users[i].group,
subgroupID = users[i].subgroup;
users[i].group = users[i].group ? groupData[groupID][name] : '';
users[i].subgroup = users[i].subgroup ?
groupData[groupID].subgroup[subgroupID][name] : '';
allUsers[users[i].id] = users[i];
}
目前,我的for循环中存在查找问题,无法获取组/子组的名称
有人能帮忙解决这个问题吗?最好使用ecma6。您正在使用groupData,就好像它是groupID所在的键一样。但是,它是一个数组。您应该尝试使用它的查找方法:
const allUsers = {};
for (var i = 0; i < users.length; i++) {
let groupID = users[i].group,
subgroupID = users[i].subgroup;
let userGroup = groupData.find(group => group.id === groupID);
users[i].group = userGroup.name
users[i].subgroup = userGroup.subgroup.find(subgroup => subgroup.id === subgroupID).pseudo;
allUsers[users[i].id] = users[i];
}
Object.assign创建一个新对象,这样它就不会改变现有用户。您正在使用groupData,就好像它是groupID所在的键一样。但是,它是一个数组。您应该尝试使用它的查找方法:
const allUsers = {};
for (var i = 0; i < users.length; i++) {
let groupID = users[i].group,
subgroupID = users[i].subgroup;
let userGroup = groupData.find(group => group.id === groupID);
users[i].group = userGroup.name
users[i].subgroup = userGroup.subgroup.find(subgroup => subgroup.id === subgroupID).pseudo;
allUsers[users[i].id] = users[i];
}
Object.assign创建一个新对象,这样它就不会变异现有用户。您可以使用array#reduce
累积用户,并使用array#find
获取组
名称和子组
伪
名称
let users=[{“id”:“123”,“email”:“john”。doe@acme.com“,”姓名“:”约翰·多伊“,”小组“:”1“,”小组“:”1“},{”id“:”456“,”电子邮件“:”汤姆。hans@stk.com,“姓名”:“汤姆·汉斯”,“小组”:“2”,“小组”:“1”}],
groupData=[{id:“1”,名称:“Stars”,子组:[{id:“1”,伪:“大”},{id:“2”,伪:“小”},{id:“2”,名称:“石头”,子组:[{id:“1”,伪:“小”},{id:“2”,伪:“大”}],
结果=用户。减少((r,用户)=>{
var{name='',subgroup=[]}=groupData.find(o=>o.id==user.group);
r[user.id]=Object.assign({},user,{group:name},{subgroup:subgroup.find(o=>o.id==user.subgroup).pseudo | |'''});
返回r;
}, {});
控制台日志(结果)
您可以使用array#reduce
累积您的用户,并使用array#find
获取组
名称和子组
伪
名称
let users=[{“id”:“123”,“email”:“john”。doe@acme.com“,”姓名“:”约翰·多伊“,”小组“:”1“,”小组“:”1“},{”id“:”456“,”电子邮件“:”汤姆。hans@stk.com,“姓名”:“汤姆·汉斯”,“小组”:“2”,“小组”:“1”}],
groupData=[{id:“1”,名称:“Stars”,子组:[{id:“1”,伪:“大”},{id:“2”,伪:“小”},{id:“2”,名称:“石头”,子组:[{id:“1”,伪:“小”},{id:“2”,伪:“大”}],
结果=用户。减少((r,用户)=>{
var{name='',subgroup=[]}=groupData.find(o=>o.id==user.group);
r[user.id]=Object.assign({},user,{group:name},{subgroup:subgroup.find(o=>o.id==user.subgroup).pseudo | |'''});
返回r;
}, {});
控制台日志(结果)代码>在此示例中如何使用对象分配?我们可以用一些映射/过滤等来代替for循环吗?如果用户没有任何组或子组会发生什么?我们如何传递'
空值?我的意思是组/子组字段根本不存在。最后一行有语法错误。。。你能看一下吗?第二个方法输出未定义的数据,只返回第一个用户错误的数据。第二个代码段是第一个代码段的一部分吗?或独立?在本例中如何使用对象分配?我们可以用一些映射/过滤等来代替for循环吗?如果用户没有任何组或子组会发生什么?我们如何传递'
空值?我的意思是组/子组字段根本不存在。最后一行有语法错误。。。你能看一下吗?第二个方法输出未定义的数据,只返回第一个用户错误的数据。第二个代码段是第一个代码段的一部分吗?或独立?如果用户没有组
字段,会发生什么情况?但他有一个小组。。。基本上,这意味着,我们不能返回任何值,所以两个值都应该返回空值。只需更新此行user.group&&groupData.find(o=>o.id==user.group)代码>如果用户没有组
字段,会发生什么?但他有一个小组。。。基本上,这意味着,我们不能返回任何值,所以两个值都应该返回空值。只需更新此行user.group&&groupData.find(o=>o.id==user.group)代码>
const allUsers = users.reduce((data, user) => {
const group = groupData.find(group => group.id === user.group);
const name = group ? group.name : '';
const subGroup = group ? group.subgroup.find(subgroup => subgroup.id === user.subgroup): null;
const pseudo = subGroup ? subGroup.pseudo : '';
data[user.group] = Object.assign({}, user, { group: name, subGroup: pseudo });
return data;
}, {});