我正在开展我的第一个Angular项目,并且我一直在考虑用这个问题解决这个问题的最好方法,但是我要试一试。
我正在构建一个使用Veralite(MiOS)以json格式返回设备数据的应用。第一个请求返回系统上的所有设备(例如下面的例子)。
"devices":[
{
"name":"Bedroom Light",
"altid":"4",
"id":6,
"category":2,
"subcategory":0,
"room":0,
"parent":1,
"status":"0",
"level":"0",
"state":-1,
"comment":""
},
{
"name":"Office Light",
"altid":"6",
"id":18,
"category":2,
"subcategory":0,
"room":0,
"parent":1,
"level":"0",
"status":"0",
"state":-1,
"comment":""
}
一旦返回所有设备,我的脚本开始长时间轮询vera引擎。对设备进行更改后,将返回长轮询的结果,但结果仅包括已更改的设备(如下所示)。
"devices":[
{
"altid":"6",
"id":"18",
"subcategory":"0",
"room":"0",
"parent":"1",
"level":"20",
"status":"1",
"state":"4",
"comment":"Office Light: Transmit was ok"
}
我试图解决的问题是使用新更新的数据更新现有设备阵列的正确方法。我是否需要将它们转换为数组,然后循环遍历每个数组并尝试通过键匹配它们?
希望我能尽可能清楚地问这个问题。
编辑: 只是为那些偶然发现这一点的人更新了这一点,特别是有兴趣为Veralite开发的人。从原始请求返回的ID将作为整数返回,但是当长轮询引擎时,ID将作为字符串返回。因此,即使选择的答案是正确的,您也需要将更新的设备ID解析为整数(parseInt),或者在过滤设备时仅使用==而不是===。
答案 0 :(得分:0)
您可以遍历对象字段,就像使用Object.keys循环遍历数组一样。
概念上类似于:
步骤1)通过字段ID:
查找更新的产品var previousVersionDevice = $scope.devices.filter(function(item) {
return item.id === updateDevice.id; // Keep only the one existing device that matches id
})[0];
步骤2)循环浏览产品中的键,并使用收到的值覆盖以前的值。
Object.keys(updatedDevice).forEach(function(key) {
previousVersionDevice[key] = updatedDevice[key]; // Overwrite/add all from updated version
});
答案 1 :(得分:0)
是的,你可以通过某种独特的密钥循环查找匹配的设备(假设id
是唯一的并且不会改变,你可以使用它)。