Использование Angular для перебора JSON и получения результата

0

У меня есть следующий формат JSON:

[{
"-KQVfnf1ZCml7dZ1dZAC": {
    "content": {
        "data": "New Order",
        "type": "text/plain"
    },
    "conversation_id": "990",
    "is_admin": false,
    "is_announce": false,
    "is_deleted": false,
    "message_id": "9694",
    "sender": {
        "name": "Paras",
        "user_id": "285"
    },
    "sent_at": "1472648381032"
},
"-KQVgEHps9L3l80nmkWb": {
    "content": {
        "data": "New Shipment",
        "type": "text/plain"
    },
    "conversation_id": "990",
    "is_admin": false,
    "is_announce": false,
    "is_deleted": false,
    "message_id": "9694",
    "sender": {
        "name": "Paras",
        "user_id": "285"
    },
    "sent_at": "1472648431073"
},
"created_at": "1472647272113",
"$id": "messages",
"$priority": null

}]

Теперь я использую Angular для получения части данных, которые мне нужны из массива JSON.

Угловой код:

$scope.user_message = [];
   $scope.user_content = [];
   angular.forEach($scope.messages, function(value, key){
     $scope.user_message.push(value);
     angular.forEach($scope.user_message, function(value, key){
       $scope.user_content.push(value[key]);
       console.log($scope.user_content);
     });
   });

Данные, которые я хочу извлечь из JSON:

{
"content": {
    "data": "New Order",
    "type": "text/plain"
},
"conversation_id": "990",
"is_admin": false,
"is_announce": false,
"is_deleted": false,
"message_id": "9694",
"sender": {
    "name": "Paras",
    "user_id": "285"
},
"sent_at": "1472648381032"

}

Итак, в основном я хочу все, что из массива JSON, кроме ключа идентификатора сообщения, который начинается с -KQV...

Но он всегда возвращает Key: 0 Value: [object Object].

Может ли кто-нибудь помочь мне с решением?

3 ответа

0
Лучший ответ

Вы можете использовать Object.keys(object).foreach() для итерации по каждому ключу объекта и проверки, начинается ли имя объекта с -KQV. Если это так, используйте этот объект. Это даст вам определенную часть каждого массива, который вы хотите. Здесь я $scope.user_message его на консоли и $scope.user_message массив $scope.user_message.

$scope.user_message = [];
for (var i=0; i < $scope.messages.length; i++) {
    Object.keys($scope.messages[i]).forEach(function(key,index) {
        if (key.substr(0, 4) == '-KQV') {
            console.log($scope.messages[i][key]);
            $scope.user_message.push($scope.messages[i][key]);
        }
    });
}
  • 0
    Спасибо доктор Кул. Оно работало завораживающе.
0

Не совсем уверен, что вам нужно, было бы неплохо, если бы вы могли расширить свой массив сообщений с помощью более типовых сообщений и обеспечить ожидаемый результат. Эта версия вашего кода запишет все объекты в каждом сообщении в $ scope.user_content (у него нет чеков для "KQV"):

$scope.user_message = [];
   $scope.user_content = [];
   angular.forEach($scope.messages, function(value, key){
     $scope.user_message.push(value);
     angular.forEach(value, function(value1, key1){
       if (value1 === null || typeof value1 !== 'object') return;
       $scope.user_content.push(value1);

     });
   });
 console.log($scope.user_content); 

Скрипт: http://jsfiddle.net/b2gy2yr1/

Я бы также рекомендовал посмотреть на lodash - это облегчает такие задачи: https://lodash.com/docs/4.15.0

  • 0
    Спасибо за помощь. Воспользуюсь вашим советом и опробую Лодаш в ближайшее время.
0

Это короче, но предполагает, что первый элемент массива JSON всегда содержит сообщения:

//var j = JSON.parse(...)
for (key in j[0]) {
  if (j[0].hasOwnProperty(key) && (key != "created_at") && (key != "$id") && (key != "$priority")) {
    console.log(j[0][key]);
  }
}

Он также черным списком ключей, которые, как мы уверены, не являются сообщениями ("created_at" и т.д.) Вместо белого списка тех, которые начинаются с определенной строки ("-Kv"), которая может в конечном итоге измениться.

  • 0
    Спасибо за акцию. Я буду держать этот фрагмент под рукой, учитывая ваши условия. Как сейчас, с кодом доктора Кул. Тем не менее Upvote для вас.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню