首页 > 解决方案 > 使用具有多个值的第二个数组过滤对象数组

问题描述

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

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

预期产出

  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;

标签: javascriptarraysobjectfilter

解决方案


这里,

const childRecords = childData.filter(function(child) {
      return child.id === parentsChildIds

parentsChildIds 是对数组的引用:您不想测试 id 是否 === 对 aa 引用,

您必须明确并检查 id 是否包含在数组中:

const childRecords = childData.filter(function(child) {
          return parentsChildIds.includes(child.id)

关于感觉很奇怪的singleParentRecord[0],因为你知道方法filter总是会返回一个大小为1或0的数组,你可以使用方法find代替filter


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

  1. 语法更密集,它使您的大脑更容易理解何时链接多个功能
  2. 如果您想使用在函数外部定义的变量,它将仅在箭头函数内部可用

您的代码带有箭头功能:

const childRecords = childData.filter((child) => {
          return child.id === parentsChildIds
}

推荐阅读