2016-12-01 76 views
0

有人可以帮助我使用javascript修改JSON对象,目前我使用角度js并从文件中获取JSON数据。但我想修改下面的JSON并相应地进行处理。JavaScript中的JSON对象修改

当前JSON

{ 
    "account": { 
    "premise": { 
     "zone": [ 
     { 
      "id": 1, 
      "name": "Tps John?!? \"':7", 
      "type": "DOOR", 
      "functionType": "ENTRY_EXIT", 
      "sensor": [ 
      { 
       "id": 1, 
       "type": "DRY_CONTACT", 
       "sourceType": "ZIGBEE", 
       "serialNumber": "000d6f00030cdbcf.1", 
       "model": "MCT-320 SMA", 
       "manufacturer": "Visonic", 
       "firmwareVersion": "0x00040008", 
       "hardwareVersion": "1" 
      } 
      ] 
     }, 
     { 
      "id": 2, 
      "name": "Motion Sensor $-*9$+%;47$9 %;:?2", 
      "type": "MOTION", 
      "functionType": "INTERIOR_FOLLOWER", 
      "sensor": [ 
      { 
       "id": 2, 
       "type": "MOTION", 
       "sourceType": "ZIGBEE", 
       "serialNumber": "000d6f0004b2af93.1", 
       "model": "NEXT K85 SMA", 
       "manufacturer": "Visonic", 
       "firmwareVersion": "0x0004000b", 
       "hardwareVersion": "1" 
      } 
      ] 
     } 
     ] 
    } 
    } 
} 

但是从上面的JSON在开发区对象有传感器的对象,但我想只保留传感器如下

{ 
    "account": { 
    "premise": { 
     "sensor": [ 
     { 
      "id": 1, 
      "type": "DRY_CONTACT", 
      "sourceType": "ZIGBEE", 
      "serialNumber": "000d6f00030cdbcf.1", 
      "model": "MCT-320 SMA", 
      "manufacturer": "Visonic", 
      "firmwareVersion": "0x00040008", 
      "hardwareVersion": "1" 
     }, 
     { 
      "id": 2, 
      "type": "MOTION", 
      "sourceType": "ZIGBEE", 
      "serialNumber": "000d6f0004b2af93.1", 
      "model": "NEXT K85 SMA", 
      "manufacturer": "Visonic", 
      "firmwareVersion": "0x0004000b", 
      "hardwareVersion": "1" 
     } 
     ] 
    } 
    } 
} 
+0

只是使用'JSON.parse()来'创建一个对象,删除属性你不这样做的一个需要并使用'JSON.stringify()'序列化它' –

回答

0

为了让您的传感器阵列,您只需在初始对象的account.premise.zone上使用.map(),如下所示:

o.account.premise.zone.map(e=>e.sensor)

可以重组完整的对象象下面这样:

let o = { 
    "account": { 
    "premise": { 
     "zone": [ 
     { 
      "id": 1, 
      "name": "Tps John?!? \"':7", 
      "type": "DOOR", 
      "functionType": "ENTRY_EXIT", 
      "sensor": [ 
      { 
       "id": 1, 
       "type": "DRY_CONTACT", 
       "sourceType": "ZIGBEE", 
       "serialNumber": "000d6f00030cdbcf.1", 
       "model": "MCT-320 SMA", 
       "manufacturer": "Visonic", 
       "firmwareVersion": "0x00040008", 
       "hardwareVersion": "1" 
      } 
      ] 
     }, 
     { 
      "id": 2, 
      "name": "Motion Sensor $-*9$+%;47$9 %;:?2", 
      "type": "MOTION", 
      "functionType": "INTERIOR_FOLLOWER", 
      "sensor": [ 
      { 
       "id": 2, 
       "type": "MOTION", 
       "sourceType": "ZIGBEE", 
       "serialNumber": "000d6f0004b2af93.1", 
       "model": "NEXT K85 SMA", 
       "manufacturer": "Visonic", 
       "firmwareVersion": "0x0004000b", 
       "hardwareVersion": "1" 
      } 
      ] 
     } 
     ] 
    } 
    } 
}; 
o = { 
    account:{ 
    premise:{ 
     sensor: o.account.premise.zone.map(e=>e.sensor) 
    } 
    } 
} 

您可能需要使用的文件数据JSON.parse()将其从字符串首先转换为一个对象。小例子:

JSON.parse("{foo:bar") //String 
> { foo:bar } //Object 
+0

伟大的工作转向映射。许多人忘记它。 +1 –

+0

您正在创建对象,而不是在现有对象中进行编辑。 – Mahi

+0

这个功能已经通过热门扑克牌进入了我的大脑,我一直使用大型对象。我清楚地记得使用'map()'之前和之后:D – xShirase

0

这不是一个优化的方式,但是这可能是解决

var input = {}; //it is your input Object 
var accountObj = { account: { premise: { sensor : [] }}}; 
input.account.premise.zone.forEach(function(zones) { 
    zones.sensor.forEach(function(sensorObj) { 
     accountObj.account.premise.sensor.push(sensorObj); 
    }); 
}); 
console.log(accountObj); 
+0

谢谢!!在这里,我们创建一个空对象,并推动值是有办法我们可以修改现有的。因为我的原始JSON内部有一些其他对象。 – Batman