Объект внутри массива внутри объекта внутри массива JavaScript - Поиск - PullRequest
1 голос
/ 05 февраля 2020

У меня есть такие данные:

   const bigData = [
  {
    id: '1',
    data: [
      {category: 'swim', value: 'Abc'},
      {category: 'ran', value: '123'},
      {category: 'play', value: 'Test'}
    ]
  },
  {
    id: '2',
    data: [
      {category: 'swim', value: 'Abc'},
      {category: 'ran', value: ''},
      {category: 'play', value: 'abc'}
    ]
  },
  {
    id: '3',
    data: [
      {category: 'swim', value: 'String that I Need'},
      {category: 'ran', value: '456'},
      {category: 'play', value: 'Testtest'}
    ]
  }
]

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

Например, если строка поиска "String tha", она должна вернуть

   [ {
    id: '3',
    data: [
      {category: 'swim', value: 'String that I Need'},
      {category: 'ran', value: '456'},
      {category: 'play', value: 'Testtest'}
    ]
  }]

А если строка поиска "Ab c", она должна вернуть

[{
        id: '1',
        data: [
          {category: 'swim', value: 'Abc'},
          {category: 'ran', value: '123'},
          {category: 'play', value: 'Test'}
        ]
      },
      {
        id: '2',
        data: [
          {category: 'swim', value: 'somethinf'},
          {category: 'ran', value: ''},
          {category: 'play', value: 'Abcd'}
        ]
      },]

Это то, что я имею до сих пор, не уверен, что это даже правильное направление к go:

const arr = bigData.map(
      (item) => item.data
    )
    const res = arr
      ?.map((item) => item.map((e) => e.value))
      .filter((i) => i.map((e) => e.includes(search) === true))

Ответы [ 2 ]

3 голосов
/ 05 февраля 2020

Нет никакой причины для map() внешнего массива для элемента data каждого объекта, поскольку возвращаемое значение и входное значение имеют одинаковую разметку. Вместо этого вы выполняете filter() для внешнего массива bigData, в котором должны храниться объекты, чей внутренний элемент массива data удовлетворяет определенному условию.

Вы можете проверить это условие, используя some(), поскольку оно применяется к каждому элементу массива, и вам важно только, существует ли соответствующий элемент.

function filterBySearch (search) {
  return bigData.filter(
    ({ data }) => data.some(
      ({ value }) => value.includes(search)
    )
  );
}

const bigData = [
  {
    id: '1',
    data: [
      {category: 'swim', value: 'Abc'},
      {category: 'ran', value: '123'},
      {category: 'play', value: 'Test'}
    ]
  },
  {
    id: '2',
    data: [
      {category: 'swim', value: 'Abc'},
      {category: 'ran', value: ''},
      {category: 'play', value: 'abc'}
    ]
  },
  {
    id: '3',
    data: [
      {category: 'swim', value: 'String that I Need'},
      {category: 'ran', value: '456'},
      {category: 'play', value: 'Testtest'}
    ]
  }
];

console.log(filterBySearch('String tha'));
console.log(filterBySearch('Abc'));
.as-console-wrapper{max-height:100%!important;}
2 голосов
/ 05 февраля 2020

Самый простой подход - это один вкладыш, уже предоставленный Патриком. Вы находитесь на правильном пути, но просто запутались в правильном использовании функций массива. Если бы вы хотели написать это как функцию, она бы выглядела следующим образом:

function searchBigData(bigData, searchText) {
    return bigData.filter(entry => entry.data.some(item => item.value.includes(searchText)));
}

Для дальнейшего использования базовая стратегия c здесь:

  1. Использование filter в массиве bigData, потому что вы хотите уменьшить его до исходных объектов, соответствующих вашим критериям.
  2. Для каждого элемента в bigData используйте some против массива data. Он вернет true, как только один из элементов в data будет соответствовать условию.
  3. Проверьте каждый элемент в data, чтобы value включил поисковый текст
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...