#reactjs #firebase #google-cloud-firestore
# #reactjs #firebase #google-облако-firestore
Вопрос:
У меня есть firestore с уроками, см. Рисунок ниже, я получаю из firestore свойство title для каждого объекта и отображаю его в браузере, но каждый раз, когда я обновляю веб-сайт, уроки сортируются по тому, как они хотят, почему это происходит? Я хочу отсортировать их так, как я хочу, я хочу начать с «Введения» и так далее, как я могу это сделать? Я думаю orderBy()
, что здесь это не работает.
Как вы видите на изображении выше, порядок в firestore в алфавитном порядке, но на моей странице сортируется по своему усмотрению, см. Рисунок ниже.
Я хочу, чтобы результат был в определенном порядке, например, у нас есть следующие заголовки, эти заголовки из 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",
},
],
});