Не удается отфильтровать массив в массив - PullRequest
0 голосов
/ 21 января 2020

У меня есть массив категорий, который содержит объектный массив специализаций. Когда я пытаюсь отфильтровать его по специализациям, что-то идет не так (список категорий, который не должен изменяться и содержать все данные, тоже меняется. И когда я удаляю буквы из списка поиска данных, он не возвращается). Я перепробовал много методов, и в конце код стал таким (я знаю, что это не очень хороший код, но я пробовал много вещей и просто устал набирать его);

Это мой метод фильтрации:

this.setState(prevState => {
  const { categories } = prevState;

  let filtered = [];

  for (let i = 0; i < categories.length; i++) {
    let newCategory = categories[i];
    const { specializations } = categories[i];
    let newSpecs = [];
    for (let j = 0; j < specializations.length; j++) {
      const { specName } = specializations[j];
      if (specName.indexOf(search) !== -1) {
        newSpecs.push(specializations[j]);
      }
    };
    newCategory.specializations = newSpecs;
    if (newSpecs.length>0) {
      filtered.push(newCategory);
    }
  }

  return {resultCategories:filtered}
});

Вот как я отображаю:

category.specializations.map(
    (spec, index) =>
      (index < 5 || collapsed[cat_index]) && (
        <Text
          onPress={() =>
            this.props.navigation.navigate("CreateOrderSecond", {
              spec: spec.id
            })
          }
          style={styles.specs}
          key={index}
        >
          {spec.specName}
        </Text>
      )
  );

Как выглядят категории:

Category{
 avatar Image{...}
 categoryName   string
 created    string($date-time)
 id integer($int64)
 lastUpdated    string($date-time)
 specializations    [Specialization{
                       avatar   Image{...}
                       created  string($date-time)
                       id   integer($int64)
                       lastUpdated  string($date-time)
                       masterName   string
                       specName string
                     }]
 }

Ответы [ 2 ]

0 голосов
/ 21 января 2020

Не уверен, что это работает для вас, но, возможно, используйте ваши .filter и .map Массив методы, чтобы уменьшить код:

const search = 'Your Search String';

const possible_slight_improvement = prevState => {
  const { categories } = prevState; // Pull categories out of prevState

  const resultCategories = categories
    .map(({ specializations = [] }) => specializations.filter(({ specName }) => specName === search))
    .filter(specializations => specializations.length > 0);

  // resultCategories will be an array of arrays that have specializations in them
  // categories will be unchanged
  return { resultCategories };
};

this.setState(possible_slight_improvement);
0 голосов
/ 21 января 2020

Вы можете попробовать это

category = {
  specializations : [
    {
      created : 2312121,
      id   : 1,
      lastUpdated  : "24-01-2020",
      masterName   : "ProductOne",
      specName :  "Food"
    },
    {
      created : 2312121,
      id   : 1,
      lastUpdated  : "24-01-2020",
      masterName   : "ProductTwo",
      specName :  "Sopping"
    },
    {
      created : 2312121,
      id   : 1,
      lastUpdated  : "24-01-2020",
      masterName   : "ProductThree",
      specName :  "Food"
    }
  ]
}
searchValue = "Food"
let results = category.specializations.filter(specialization => specialization.specName === searchValue)


console.log(results)
...