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是唯一的,为什么不使用对象呢?我喜欢你对上面关于在两个集合上迭代的另一个答案的评论,而你的答案完全相同。