使用Angular迭代JSON并获得结果

时间:2016-09-01 17:39:47

标签: javascript angularjs json

我有以下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数组中检索我需要的部分数据。

Angular Code是:

$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开头的消息id键...

但它始终返回Key:0 Value:[object Object]。

任何人都可以帮我解决问题吗?

3 个答案:

答案 0 :(得分:0)

您可以使用-static -lboost_thread语法迭代对象的每个键,并检查对象名称是否以Object.keys(object).foreach()开头。如果是这样,请使用该对象。这将为您提供所需的每个数组的特定部分。在这里,我将它打印到控制台并将其推入-KQV数组。

$scope.user_message

答案 1 :(得分:0)

这个更短但是假设JSON数组的第一个元素始终包含消息:

class Geoobject(m.db.Model):
    __tablename__ = 'geoobjects'
    id = m.db.Column(m.db.Integer, primary_key=True)
    name = m.db.Column(m.db.String)

    def __init__(self, code: int, name: str):
        self.code = code
        self.name = name

class Region(Geoobject):

    __tablename__ = 'regions'
    id = m.db.Column(m.db.Integer, m.db.ForeignKey('geoobjects.id'),
                     primary_key=True)
    code = m.db.Column(m.db.Integer)

    def __init__(self, name: str, code: int):
        self.name = name
        self.code = code
        self.region_id = self.id

class TransportArea(Geoobject):

    __tablename__ = 'transport_areas'
    id = m.db.Column(m.db.Integer, m.db.ForeignKey('geoobjects.id'),
       primary_key=True, autoincrement=True)
    region = m.db.relationship('Region',
                          foreign_keys='Region.id', uselist=False)
    def __init__(self,
             name: str,
             region: Iterable[Region]):
        self.name = name
        self.region = region

它还会将我们确定不是邮件的密钥(' created_at'等)列入黑名单,而不是将那些以特定字符串开头的密钥列入白名单(' -Kv' ),最终可能会改变。

答案 2 :(得分: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