Javascript 返回对象数组(来自对象数组)

Javascript 返回对象数组(来自对象数组),javascript,Javascript,我有以下数据,我想返回一个不同的年份的数组(对象) 我尝试了以下函数,但得到的是数组中的数组 const数据=[{ id:1, 名称:“test1”, 年份:[{ id:1, 姓名:“第一年” }, { id:2, 姓名:“第二年” }] }, { id:2, 名称:“test2”, 年份:[{ id:1, 姓名:“第一年” }] }, ] 让年份=数据。地图((s)=>{ 回归美国 }) 让distinctYears=Array.from(新集合(years.map(c=>c.id))).m

我有以下数据,我想返回一个不同的
年份的数组(对象)

我尝试了以下函数,但得到的是数组中的数组

const数据=[{
id:1,
名称:“test1”,
年份:[{
id:1,
姓名:“第一年”
}, {
id:2,
姓名:“第二年”
}]
},
{
id:2,
名称:“test2”,
年份:[{
id:1,
姓名:“第一年”
}]
},
]
让年份=数据。地图((s)=>{
回归美国
})
让distinctYears=Array.from(新集合(years.map(c=>c.id))).map(id=>{
返回{
id:id,
name:years.find(c=>c.id==id).name,
}
})
控制台日志(distinctYears)
因为
s.years()
是一个数组,而
data.map()
返回一个结果数组,所以
years
必然是一个数组数组

不要使用
.map()
,而是使用
.reduce()
将它们连接起来

const数据=[{
id:1,
名称:“test1”,
年份:[{
id:1,
姓名:“第一年”
}, {
id:2,
姓名:“第二年”
}]
},
{
id:2,
名称:“test2”,
年份:[{
id:1,
姓名:“第一年”
}]
},
];
常数年=数据减少((a{
年
})=>a.concat(年),[]);
让distinctYears=Array.from(新集合(years.map(c=>c.id))).map(id=>{
返回{
id:id,
name:years.find(c=>c.id==id).name,
}
});

控制台日志(distinctYears)有很多方法可以做到这一点。这里有一个,它不是一个单一的班轮,但它分解成部分,以帮助我们了解发生了什么

您的数据集:

let data =
[
  {
    id: 1,
    name: "test1",
    years: [{id: 1, name: "year1"}, {id: 2, name: "year2"} ]
  },
  {
    id: 2,
    name: "test2",
    years: [{id: 1, name: "year1"} ]
  },
]
使用
.flatMap()
创建包含所有项目的一级数组:

let allItems = data.flatMap((item) => {
    return item.years.map((year) => {
        return year
    })
})
获取不同的项目:

let distinct = []

allItems.forEach((item) => {
    let matchingItem = distinct.find((match) => match.id == item.id && match.name == item.name)

    if(!matchingItem){
        distinct.push(item)
    }
})
实际上:
let数据=[{
id:1,
名称:“test1”,
年份:[{
id:1,
姓名:“第一年”
}, {
id:2,
姓名:“第二年”
}]
},
{
id:2,
名称:“test2”,
年份:[{
id:1,
姓名:“第一年”
}]
},
]
让allItems=data.flatMap((项)=>{
返回项目.years.map((年)=>{
回归年
})
})
让独立=[]
allItems.forEach((项目)=>{
让matchingItem=distinct.find((match)=>match.id==item.id&&match.name==item.name)
如果(!匹配项){
不同。推送(项目)
}
})

console.log(distinct)
需要区分哪些内容,id还是名称?或者两者都返回?我想返回两者,但根据id不同。我在问题中包含了期望的结果。