javascript 循环嵌套数组并根据另一个数组提取属性
javascript loop nested array and extract properties based on another array
我有一个如下所示的 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',
},
];
我想获取 hobbies 数组中所有 id
的列表,并遍历 sports 数组中的每个运动项目,然后找到,向该对象添加一个额外的字段 available
并给出 true
的值,以及 其对应的团队名称 ,因此结果将如下所示:
const result = [
{
name: 'volleyball',
coach: 'tom',
},
{
name: 'waterpolo',
coach: 'jack',
},
{
name: 'swimming',
coach: 'kate',
},
{
name: 'football',
coach: 'sara',
available: true, // it exists in kids' hobbies
team: 'DEF' // get it from kids' hobbies
},
];
顺便说一句,这是我的尝试:
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)
但这不包括团队。我怎样才能将它添加到上面的代码中?
使用.find
找到合适的爱好对象,如果存在则提取其team
:
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',},];
const { hobbies } = kids.extra;
const result = sports.map((sportObj) => {
const foundObj = hobbies.find(({ id }) => id === sportObj.name);
if (!foundObj) return { ...sportObj };
return {...sportObj, team: foundObj.team, available: true };
});
console.log(result);
没有点差:
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',},];
const { hobbies } = kids.extra;
const result = sports.map((sportObj) => {
const foundObj = hobbies.find(({ id }) => id === sportObj.name);
if (!foundObj) return Object.assign({}, sportObj);
return Object.assign({}, sportObj, { team: foundObj.team, available: true });
});
console.log(result);
在您的代码中,result
数组和 kids.extra.hobbies
具有相同的数组索引(因为一个映射到另一个)。因此,您可以从爱好中使用 foundIndex
查找爱好对象:
const result = kids.extra.hobbies.map(a => a.id);
for (var key in sports) {
const foundIndex = result.indexOf(sports[key].name);
if ( foundIndex > -1) {
sports[key].available = true;
// lookup hobby at `foundIndex`
sports[key].team = kids.extra.hobbies[foundIndex].team;
}
}
console.log(sports)
我有一个如下所示的 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',
},
];
我想获取 hobbies 数组中所有 id
的列表,并遍历 sports 数组中的每个运动项目,然后找到,向该对象添加一个额外的字段 available
并给出 true
的值,以及 其对应的团队名称 ,因此结果将如下所示:
const result = [
{
name: 'volleyball',
coach: 'tom',
},
{
name: 'waterpolo',
coach: 'jack',
},
{
name: 'swimming',
coach: 'kate',
},
{
name: 'football',
coach: 'sara',
available: true, // it exists in kids' hobbies
team: 'DEF' // get it from kids' hobbies
},
];
顺便说一句,这是我的尝试:
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)
但这不包括团队。我怎样才能将它添加到上面的代码中?
使用.find
找到合适的爱好对象,如果存在则提取其team
:
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',},];
const { hobbies } = kids.extra;
const result = sports.map((sportObj) => {
const foundObj = hobbies.find(({ id }) => id === sportObj.name);
if (!foundObj) return { ...sportObj };
return {...sportObj, team: foundObj.team, available: true };
});
console.log(result);
没有点差:
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',},];
const { hobbies } = kids.extra;
const result = sports.map((sportObj) => {
const foundObj = hobbies.find(({ id }) => id === sportObj.name);
if (!foundObj) return Object.assign({}, sportObj);
return Object.assign({}, sportObj, { team: foundObj.team, available: true });
});
console.log(result);
在您的代码中,result
数组和 kids.extra.hobbies
具有相同的数组索引(因为一个映射到另一个)。因此,您可以从爱好中使用 foundIndex
查找爱好对象:
const result = kids.extra.hobbies.map(a => a.id);
for (var key in sports) {
const foundIndex = result.indexOf(sports[key].name);
if ( foundIndex > -1) {
sports[key].available = true;
// lookup hobby at `foundIndex`
sports[key].team = kids.extra.hobbies[foundIndex].team;
}
}
console.log(sports)