首页 > 解决方案 > javascript映射两个嵌套数组并通过查找修改现有

问题描述

我有一个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',
    },
];

我想获取idhobbies 数组中所有 s 的列表,并遍历 sports 数组中的每个运动项目,并找到,为该对象添加一个额外的字段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)

但这太长了......我正在寻找一个看起来代码和健壮逻辑的班轮。

标签: javascriptarraysjsonecmascript-6mapreduce

解决方案


这可以通过多种方式完成;但是,一个简单的方法是将问题分为两个步骤:

我们可以先用Array.map()函数把孩子的爱好扁平化成一个数组:

const hobbies = kids.extra.hobbies.map(hobby => hobby.id);

然后,我们可以遍历运动数组并向active新数组中存在的任何对象添加一个属性hobbies

const result = sports.map(sport => {
  if (hobbies.indexOf(sport.name) !== -1) {
    sport.available = true;
  }

  return sport;
})

完整的解决方案

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.hobbies.map(hobby => hobby.id);


const result = sports.map(sport => {
  if (hobbies.indexOf(sport.name) !== -1) {
    sport.available = true;
  }

  return sport;
})

console.log(result);


推荐阅读