我正在尝试编写一个函数来获取“父”数组中的第一个对象,拉出子字段(位于该数组中),然后使用该字段过滤名为“子”的第二个对象。
我想从子对象中获取父对象的子字段中的所有相关记录。
预期产量
child: [
{
**id: 1,**
name: 'Jimmy Yukka',
},
{
**id: 2,**
name: 'Up North',
}
输入
Parent: [
{
**id: 1,**
name: 'Melbourne Bands',
**child: [1, 2]**
}
我有以下数据
Parent: [
{
**id: 1,**
name: 'Melbourne Bands',
**child: [1, 2]**
},
{
id: 2,
name: 'Sydney Bands',
child: [3]
}
],
child: [
{
**id: 1,**
name: 'Jimmy Yukka',
},
{
**id: 2,**
name: 'Up North',
},
{
id: 3,
url: 'jimmyyukka.com',
name: 'INXS',
CreatedByUserId: 1
}
],
到目前为止我已经实现的功能代码:
currentChildrenIds(ParentId, parentData, childData) {
const singleParentRecord = parentData.filter(function(parent) {
return parent.id === ParentId;
});
const parentsChildIds = singleParentRecord[0].books;
const childRecords = childData.filter(function(child) {
return child.id === parentsChildIds
});
return childRecords
}
注释 这是错误的地方
const childRecords = childData.filter(function(child) {
return child.id === parentsChildIds
这里也有点垃圾(对[0]进行硬编码),但是我不确定如何正确编码
const parentsChildIds = singleParentRecord[0].books;
答案 0 :(得分:1)
在这里
const childRecords = childData.filter(function(child) {
return child.id === parentsChildIds
parentsChildIds是对数组的引用:您不想测试id是否===引用,
您必须明确并检查ID是否包含在数组中:
const childRecords = childData.filter(function(child) {
return parentsChildIds.includes(child.id)
关于感到奇怪的singleParentRecord [0], 因为您知道方法过滤器将始终返回大小为1或0的数组, 您可以使用find方法代替filter
也在函数式编程中(数组函数,例如过滤器,映射,查找...) 我建议您阅读一下有关箭头函数语法的内容,因为:
带有箭头功能的代码:
const childRecords = childData.filter((child) => {
return child.id === parentsChildIds
}
答案 1 :(得分:0)
尝试一下:
const Parent = [
{
id: 1,
name: 'Melbourne Bands',
child: [1, 2]
},
{
id: 2,
name: 'Sydney Bands',
child: [3]
}
];
const children = [
{
id: 1,
name: 'Jimmy Yukka',
},
{
id: 2,
name: 'Up North',
},
{
id: 3,
url: 'jimmyyukka.com',
name: 'INXS',
CreatedByUserId: 1
}
];
// We create a new array with Array.map
const result = Parent.map(parent => ({
// Spread properties of the parent
...parent,
// Override the child property and filter the children array with the `includes` method
child: children.filter(child => parent.child.includes(child.id)),
}))
console.log(result);