Как отсортировать, как вы хотите данные из firestore

#reactjs #firebase #google-cloud-firestore

# #reactjs #firebase #google-облако-firestore

Вопрос:

У меня есть firestore с уроками, см. Рисунок ниже, я получаю из firestore свойство title для каждого объекта и отображаю его в браузере, но каждый раз, когда я обновляю веб-сайт, уроки сортируются по тому, как они хотят, почему это происходит? Я хочу отсортировать их так, как я хочу, я хочу начать с «Введения» и так далее, как я могу это сделать? Я думаю orderBy() , что здесь это не работает.

порядок firestore

Как вы видите на изображении выше, порядок в firestore в алфавитном порядке, но на моей странице сортируется по своему усмотрению, см. Рисунок ниже.

веб-сайт worder

Я хочу, чтобы результат был в определенном порядке, например, у нас есть следующие заголовки, эти заголовки из firestore: «Отображение», «Введение», «Выравнивание», моя проблема в том, что эти 3 заголовка находятся в новом порядке каждый раз, когда я обновляю веб-сайт, я хочуони должны быть: «Введение», «Выравнивание», «Отображение». В моем случае у меня больше заголовков, но это то, что происходит, я не знаю, как выровнять их так, как я хочу, или даже по алфавиту, если это возможно.

Ниже приведен код, который я использовал для получения данных из firestore:

 useEffect(() => {
  
    db.collection("users")

      .doc(`${user.uid}`)
      .get()
      .then((doc) => {
        const allData = { ...doc.data(), id: doc.id };
        const intoArray = Object.entries(allData);
        intoArray.sort(); // I used sort here because I had the same problem 
                          // (every time a new order) with the 
                          // data when I converted it to an array

        const getCSSLessons = intoArray[0][1];
        const cssData = Object.values(getCSSLessons);
        setCss(cssData);

        const getHTMLLessons = intoArray[1][1];
        const htmlData = Object.values(getHTMLLessons);
        setHtml(htmlData);

        const getResLessons = intoArray[3][1];
        const resData = Object.values(getResLessons);
        setRes(resData);
      })
      .catch((error) => console.log(error));

  }, [user]);

 

Я пытался использовать sort() , для переменной (htmlData), но она не работает.
Кроме того, я использую map() для их отображения, если это поможет вам ответить на мой вопрос.

Комментарии:

1. Мне неясно, что работает не так, как вы ожидаете. Я не знаю, что это значит: » уроки сортируются по тому, как они хотят «. Пожалуйста, отредактируйте свой вопрос, чтобы более подробно объяснить, чего вы ожидаете, и чем это отличается от того, что происходит на самом деле. Вероятно, вам придется написать более понятный код для сортировки массива по любым вашим требованиям.

2. Как вы видите на картинке с фактического веб-сайта, результат начинается с «Правил», когда я обновляю веб-сайт, будет другой заголовок, не в точном порядке, и это происходит каждый раз, когда я обновляю веб-сайт, появляется новый порядок результатов.

3. Вы не определяете порядок, в котором Firebase должен представлять данные вашему приложению. Вы можете либо включить опцию сортировки при получении документов, либо отсортировать в коде.

Ответ №1:

Если вы используете sort без каких-либо аргументов, он будет сортировать элементы массива в алфавитном порядке. Похоже, что ваши элементы массива — это массивы, которые приведут к неожиданному поведению. Используйте sort аргумент, чтобы убедиться, что он использует ваши собственные правила сортировки. Например:

 const intoArray = Object
  .entries(allData)
  // I don't know what should be the sorting algorithm
  // As an example, I consider each element (`a` and `b`) to 
  // be arrays and compare both first element as a Number
  .sort( (a, b) => a[0] - b[0])
 

Редактировать

Более безопасный способ поиска элементов в массиве — использовать find :

 const getCSSLessons = intoArray[0]
  .find( element => element.name === 'CSS Lessons');
 

Комментарии:

1.проблема не в этом, в intoArray том, что я только конвертирую данные из firestore, которые являются объектом, в массив, у меня была такая же проблема, когда элементы из массива были в новом порядке каждый раз, когда я обновлял веб-сайт, но работал только sort() он, моя проблема в cssData htmlData resData переменных и,если я регистрирую эти переменные в консоли, я получаю новый порядок для элементов, которые находятся в каждой переменной каждый раз, когда я обновляю, метод sort() на самом деле не работает.

2. Какой результат console.log(allData) ?

3. На самом деле это данные из firestore, первое изображение из сообщения, я получаю 3 объекта, потому что у меня есть 3 объекта в документе firestore, и элементы из каждого объекта выровнены по алфавиту. Я преобразую объект в массив с intoArray переменной, и элементы сортируются в алфавитном порядке, до сих пор это хорошо, значение для intoArray переменной равно 3 массивам с этими объектами из документа firestore, я получаю каждый массив с определенной переменной, пример: getCSSLessons , затем я получаю значение также вмассив из getCSSLessons переменной, чтобы я мог отобразить его в Интернете.

4. проблема в том, что когда я показываю результат каждый раз, когда обновляю страницу, применяется новый порядок для элементов cssData (это происходит для всех 3 документов, resData и htmlData я хочу знать, как я могу установить определенный порядок.

5. Вы пытались использовать sort в каждом подмассиве?

Ответ №2:

Я делал что-то ненужное, как вы видите на первом рисунке, у меня был основной объект, css и в этом объекте у меня были подобъекты, такие как alignment и в подобъекте, у меня были свойства, которые я хочу отобразить, этот подобъект был ненужным, вместо подобъектов с заранее определенным именем, я позволилfirebase для подсчета вложенных объектов и добавления в качестве имени числа и порядка такой же, как я хотел.

введите описание изображения здесь

Код, который я использовал для добавления данных в firebase:

 
fire
      .auth()
      .createUserWithEmailAndPassword(email, password)
      .then((cred) => {
        return db
          .collection("users")
          .doc(cred.user.uid) 
          .set({
            
           css: [
              {
                title: "Introduction",
                path: "/css3/introduction",
              },
              {
                title: "Priority",
                path: "/css3/priority",
              },
          
            ],

           });