2015-07-27 5 views
0

Я использую Firebase для проекта и должен возвращать объект на основе его позиции массива.Извлечь объект на основе его расположения в Firebase

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

Другими словами, если у меня есть Firebase массив Динос:

"dinos" : 
    { 
     "lambeosaurus": { 
     "height" : 2.1, 
     "length" : 12.5, 
     "weight": 5000 
     }, 
     "stegosaurus": { 
     "height" : 4, 
     "length" : 9, 
     "weight" : 2500 
     } 
    } 

есть способ для меня, чтобы вернуть объект, хранящийся в Динос [1]?

+0

ближайший ответ, который я нашел, был в этом сообщении в блоге, но на самом деле он не объясняет, как найти объект. https://www.firebase.com/blog/2014-04-28-best-practices-arrays-in-firebase.html – unfollow

+1

Пример, который вы опубликовали, не похож на массив - массив будет использовать квадратные скобки [] вокруг коллекции и обертывания каждого элемента в фигурных скобках для создания объектов, при этом lambeosaurus и stegosaurus продолжают оставаться свойствами имени. Это данные, которые вы вложили или что вы получили? Как упоминалось в ссылке Unfollow, Firebase управляет структурой массивов ... –

+0

Похоже, Firebase принимает объекты JSON и преобразует их в структуры данных объекта, содержащие «дочерние» объекты. я не уверен в точной номенклатуре структуры данных FB, но разве не все еще можно найти дочерние объекты на основе их положения в родительском объекте? – unfollow

ответ

0

Для всех, кто заинтересован, этот подход сработал. Если у кого-то есть отзывы о том, как это можно реорганизовать, это было бы здорово.

var userDict = {};  

function getUserList(){ 
    usersRef.once("value", function(snapshot) { 
    userDict = snapshot.val(); 
    for(i=0; i < Object.keys(userDict).length; i++){ 
     console.log(Object.keys(userDict)[i]);//<---returns list of unique URLS 
     console.log(userDict[Object.keys(userDict)[i]].dinos); 
    } 
    }); 
} 
+0

Хотя это подход, он напрямую не отвечает на исходный вопрос, который должен был возвращать объект на основе его позиции массива. Като говорит о том, что не использует массивы (мы узнали этот урок), но большая проблема здесь заключается в том, что этот код становится неэффективным для больших наборов данных. Представьте, если узел содержит миллион детей, и каждый ребенок имеет собственный набор данных. Этот код считывает весь узел за один раз и выполняет итерацию более миллиона записей. Это не только заполнит память, но и свяжет пользовательский интерфейс. Имеет смысл просто прямо прочитать узел данных, который вы хотите? – Jay

+0

О ... Словари не имеют гарантии заказа, так что технически позиция каждого объекта может измениться с чтения на чтение, чтобы «индекс» мог быть разным каждый раз. Кроме того, (и кто-то проверяет меня на этом) чтение данных узла из Firebase не имеет гарантированного порядка, поэтому объекты, содержащиеся в снимке, могут также находиться в разных положениях. – Jay

0

Пример, приведенный здесь, приведен ниже: ordering data, и совершенно непонятно, как вы перешли от этого к попытке принудительно установить уникальные идентификаторы для каждой записи в индексы массива.

Первый ответ: don't use arrays in distributed data

Второй ответ: поле, используемое в orderBy() является индексом. Таким образом, если бы я использовать пример из того же документа:

var ref = new Firebase("https://dinosaur-facts.firebaseio.com/dinosaurs"); 
ref.orderByChild("height").on("child_added", function(snapshot) { 
    console.log(snapshot.key() + " was " + snapshot.val().height + " meters tall"); 
}); 

Затем, чтобы изменить порядок динозавра, я бы изменить height поля на другое значение. Для таблицы лидеров мы бы orderByChild('score') или, для получения списка чатов, orderByChild('timestamp'). Эти поля затем будут контролировать упорядочение хэшей JSON (т. Е. Объекты с ключами, которые по своей сути неупорядочены в JavaScript и JSON, а не массивы).

+0

Не пытайтесь силой разобрать, извините, если это было неясно. Я ищу, чтобы найти позиции объекта. Я действительно придумал решение. Проверьте ниже. – unfollow

0

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

Учитывая набор данных (да, плохой вид на «индексы»)

"dinos" : 
    { 
     "0": { 
     "name": "lambeosaurus": 
     "height" : 2.1, 
     "length" : 12.5, 
     "weight": 5000 
     }, 
     "1": { 
     "name": "stegosaurus": 
     "height" : 4, 
     "length" : 9, 
     "weight" : 2500 
     } 
    } 

Теперь у вас есть много гибкости:

Если вы знаете «индекс» число 0, 1 и т.д., вы можете прямо читать у ребенка. Таким образом, чтобы получить Дино на «индекс» # 1:

Firebase *allDinosRef = [rootRef [email protected]"dinos"]; 
Firebase *aDinoRef = [allDinosRef [email protected]"1"]; 

[aDinoRef observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) { 
      //do something with the dino index #1 data 
     }]; 

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

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

"dinos" : 
     { 
      auto_generated_id: { 
      "name": "lambeosaurus": 
      "height" : 2.1, 
      "length" : 12.5, 
      "weight": 5000 
      "index": "0" 
      }, 
      auto_generated_id: { 
      "name": "stegosaurus": 
      "height" : 4, 
      "length" : 9, 
      "weight" : 2500 
      "index": "1" 
      } 
     } 

auto_generated_id является Firebase идентификатора, который будет сгенерирован с помощью childByAutoId

Используя эту структуру, можно составить простой запрос, чтобы получить Дина на индекс #, который вас интересует.

FQuery *allDinos = [rootRef queryOrderedByChild:@"index"]; 
FQuery *specificDino = [allDinos queryEqualToValue:@"1"]; 

[specificDino observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) { 
    //do something with Dino at 'index' 1 
}]; 

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