Фильтровать массив объектов вторым массивом с несколькими значениями - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь написать функцию для получения первого объекта в массиве «parent», извлечения дочернего поля (которое находится в этом массиве) и использования этого поля для фильтрации второго объекта, называемого «child».

Я хочу получить все связанные записи из дочернего объекта, которые находятся в дочернем поле родительского объекта.

Ожидаемый результат

  child: [
    {
      **id: 1,**
      name: 'Jimmy Yukka',
    },
    {
      **id: 2,**
      name: 'Up North',
    }

INPUT

 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

Этот бит здесь тоже немного рубби sh (жесткое кодирование [0]), но я не уверен, как правильно его кодировать

 const parentsChildIds = singleParentRecord[0].books;

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

здесь,

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

parentChildIds - это ссылка на массив: вы не хотите проверять, является ли идентификатор === для ссылки,

Вы должны быть явный и проверьте, содержится ли идентификатор в массиве:

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

Что касается singleParentRecord [0], который выглядит странно, так как вы знаете, что метод фильтра всегда будет возвращать массив размера 1 или 0, вы можно использовать метод find вместо фильтра


Также в функциональном программировании (функции массива, такие как filter, map, find ...) Я советую вам прочитать немного о синтаксисе функции стрелки, потому что:

  1. Синтаксис более плотный, и вашему мозгу будет легче понять, когда несколько функций связаны между собой
  2. Если вы хотите использовать переменные, которые определены вне функции, это будет доступно только внутри функции стрелки

ваш код с функцией стрелки:

const childRecords = childData.filter((child) => {
          return child.id === parentsChildIds
}
0 голосов
/ 09 апреля 2020

Попробуйте это:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...