使用具有多个值的第二个数组过滤对象数组

时间:2020-04-09 15:51:33

标签: javascript arrays object filter

我正在尝试编写一个函数来获取“父”数组中的第一个对象,拉出子字段(位于该数组中),然后使用该字段过滤名为“子”的第二个对象。

我想从子对象中获取父对象的子字段中的所有相关记录。

预期产量

  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;

2 个答案:

答案 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


也在函数式编程中(数组函数,例如过滤器,映射,查找...) 我建议您阅读一下有关箭头函数语法的内容,因为:

  1. 该Syntex更加密集,当多个功能链接在一起时,它使您的大脑更容易理解
  2. 如果要使用在函数外部定义的变量,则只能在箭头函数内部使用

带有箭头功能的代码:

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);