JavaScript - переместить элементы массива в начало массива - PullRequest
0 голосов
/ 05 октября 2019

У меня есть SectionList, который отображает список продуктов (с renderSectionHeader). Каждый заголовок имеет значок звездочки рядом с ним, и я хотел бы изменить порядок категорий на прессе этого значка звездочки. Например, если пользователь нажимает на автомобили и здания, я бы хотел, чтобы обе эти категории переместились наверх.

Это мой SectionList:

<SectionList
    sections={this.state.products}
    renderSectionHeader={({section}) => (
        <TouchableOpacity onPress={()=>{this.sortFavorite(section.key)}}>
            <Text>{section.key}</Text>
            <FontAwesome name="star" color="grey" />
        </TouchableOpacity>
    )}
    renderItem={({item,index}) => (
        <Text>{item.name}<Text>
    )}
/>

Сначала я создал массивсохранить / удалить избранные категории onPress:

sortFavorite = (currentCategory) => {
    let items = this.state.products
    let favouriteCategories = this.state.favouriteCategories
    let index = favouriteCategories.indexOf(currentCategory)

    if(index === -1){
      for(let i =0; i < items.length; i++){
        if(items[i].key === currentCategory){
          favouriteCategories.push(
            items[i].key
          )
        }
      }
    }
    else {
      favouriteCategories.splice(index, 1);
    }

    this.setState({favouriteCategories: favouriteCategories},()=>{
        // move to top of array
        const sortedCategories = _.sortBy(items, (item) => {
        const index = favouriteCategories.indexOf(item.key)
         return index == -1 ? items.length : index
        })
    })
  }

Как сравнить мой массив товаров с моими любимыми категориями и переупорядочить массив товаров?

Это мой массивиз продуктов выглядит так:

0: {key: "Fruits", data: Array(1)}
1: {key: "Cars", data: Array(10)}
2: {key: "Buildings", data: Array(4)} 

Вот так выглядит мой массив избранных категорий:

["Cars","Buldings"]

Я с радостью использую lodash, если есть способ сделать это сэто.

Ответы [ 2 ]

0 голосов
/ 05 октября 2019

Для этого вам не нужен lodash, нужна просто обычная сортировка

const favoriteCategoriesSet = new Set(favoriteCategories)
const sortedProductsTree = productsTree.sort((a, b) => favoriteCategoriesSet.has(b.key) - favoriteCategoriesSet.has(a.key))
0 голосов
/ 05 октября 2019

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

const categories = [
  {key: "Fruits", data: Array(1)},
  {key: "Cars", data: Array(2)},
  {key: "Buildings", data: Array(1)},
  {key: "Blah", data: Array(1)}

];

const favoriteCatIds =  ["Buildings", "Cars"];

const sortedCategories = _.sortBy(categories, (item) => {
  const index = favoriteCatIds.indexOf(item.key);
  return index == -1 ? categories.length : index;
});

console.log(sortedCategories);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
...