javascript映射两个嵌套数组并通过查找修改现有数组
我有一个javascript映射两个嵌套数组并通过查找修改现有数组,javascript,arrays,json,ecmascript-6,mapreduce,Javascript,Arrays,Json,Ecmascript 6,Mapreduce,我有一个kids对象,看起来如下所示: const kids = { name: 'john', extra: { city: 'London', hobbies: [ { id: 'football', team: 'ABC', }, { id: 'basketball',
kids
对象,看起来如下所示:
const kids = {
name: 'john',
extra: {
city: 'London',
hobbies: [
{
id: 'football',
team: 'ABC',
},
{
id: 'basketball',
team: 'DEF',
},
],
},
};
我有一个对象,它包含了所有的运动项目和每个项目的额外信息
const sports = [
{
name: 'volleyball',
coach: 'tom',
},
{
name: 'waterpolo',
coach: 'jack',
},
{
name: 'swimming',
coach: 'kate',
},
{
name: 'football',
coach: 'sara',
},
];
我想获得嗜好数组中所有id
s的列表,并浏览运动数组中的每个运动项目,然后找到,向该对象添加一个额外字段available
,并给出一个值true
,因此结果如下所示:
const result = [
{
name: 'volleyball',
coach: 'tom',
},
{
name: 'waterpolo',
coach: 'jack',
},
{
name: 'swimming',
coach: 'kate',
},
{
name: 'football',
coach: 'sara',
available: true
},
];
顺便说一下,以下是我的尝试:
const result = kids.extra.hobbies.map(a => a.id);
for (var key in sports) {
console.log(sports[key].name);
const foundIndex = result.indexOf(sports[key].name);
if ( foundIndex > -1) {
sports[key].available = true;
}
}
console.log(sports)
但这太长了。。。我正在寻找一行代码和健壮的逻辑。这可以通过多种方式实现;然而,一个简单的方法是将问题分为两个步骤: 我们可以首先使用
array.map()
函数将孩子的爱好展平成一个数组:
const hobbies = kids.extra.hobbies.map(hobby => hobby.id);
然后,我们可以迭代运动数组,并向新的业余爱好数组中存在的任何对象添加active
属性:
const result = sports.map(sport => {
if (hobbies.indexOf(sport.name) !== -1) {
sport.available = true;
}
return sport;
})
完整解决方案
const kids={
姓名:'约翰',
额外:{
城市:“伦敦”,
爱好:[{
id:‘足球’,
团队:“ABC”,
},
{
id:'篮球',
团队:“DEF”,
},
],
},
};
康斯特体育=[{
名称:"排球",,
教练:“汤姆”,
},
{
名称:“水球”,
教练:“杰克”,
},
{
名称:"游泳",,
教练:“凯特”,
},
{
名称:'足球',
教练:“莎拉”,
},
];
const cabiods=kids.extra.cabiods.map(hobby=>hobby.id);
const result=sports.map(sport=>{
如果(嗜好.索引of(运动.名称)!=-1){
sport.available=true;
}
回归运动;
})
控制台日志(结果)
首先构建一个已找到运动的数组,然后在检查运动对象的名称是否在其中时映射:
const kids={name:'john',extra:{city:'London',嗜好:[{id:'football',team:'ABC',},{id:'basketball',team:'DEF',},},],},}
康斯特体育=[{姓名:'排球',教练:'汤姆',},{姓名:'水球',教练:'杰克',},{姓名:'游泳',教练:'凯特',},{姓名:'足球',教练:'莎拉',},];
const sportsInHobbies=kids.extra.cabiods.map(({id})=>id);
const result=sports.map((sportObj)=>{
可用常数=sportsInHobbies.includes(sportObj.name);
返回可用?{…sportObj,available}:{…sportObj};
});
控制台日志(结果)代码>首先,我会将数据结构更改为对象。每当你有一个具有唯一ID的事物列表时,对象将使你的生活比数组容易得多。考虑到这一点,如果必须使用数组,可以执行以下操作:
const hobbies = kids.extra.hobbies
sports.forEach(s => s.available = hobbies.some(h => h.id === s.name))
请注意,这会对原始运动对象进行变异(更改为“新映射”),并且还会添加false/true
,而不仅仅是true。只是一个旁注,为什么这些数组?如果ID是唯一的,为什么不使用对象呢?我喜欢你对上面关于在两个集合上迭代的另一个答案的评论,而你的答案完全相同。