从JavaScript中的循环创建的对象,如何在json中对其进行分析

时间:2018-07-01 14:18:03

标签: javascript json object

我是Java语言的初学者,我需要分析在循环中生成的JavaScript对象,以保留一个参数,并为循环中生成的所有对象保存此参数。

这是我的程序

var onvif = require('onvif');
var fs = require('fs');

var nombrecamera=0;
var taille=0;
var test ='';

function sleep (time) {
    return new Promise((resolve) => setTimeout(resolve, time));
}

var STREAM = fs.createWriteStream('STREAM.txt',{flags:'r+'});

onvif.Discovery.on('device', function(cam,rinfo,xml){
    // function will be called as soon as NVT responses
    nombrecamera+=1;
    console.log(cam);
    test += cam;
    cam2= JSON.stringify({cam}, null  , ' ');
    //console.log(cam2);
    STREAM.write(cam2);
    console.log(test);
});

onvif.Discovery.probe({timeout:1000,resolve:false});

在我的示例中的输出中,我有四个:

{ probeMatches:
   { probeMatch:
      { endpointReference: [Object],
        types: 'tdn:NetworkVideoTransmitter',
        scopes: ' onvif://www.onvif.org/type/video_encoder     onvif://www.onvif.org/location/country/china onvif://www.onvif.org/type/network_video_transmitter onvif://www.onvif.org/hardware/IPC-122     onvif://www.onvif.org/Profile/Streaming onvif://www.onvif.org/name/IPC-BO',
        XAddrs: 'http://192.168.1.81:10004/onvif/device_service',
        metadataVersion: 1 
      } 
   } 
}

我只想保留所有生成对象的XAddrs,然后将它们放在json中。

我的第一个想法是对这个对象进行字符串化处理,然后创建一个可写流并将所有json放在一起,但是在这种情况下json之间没有逗号,因此它不会使用整个数据创建一个大json。

谢谢您的帮助

朱尔斯

2 个答案:

答案 0 :(得分:2)

知道多少个地址的最简单方法是数组的.length函数。

由于我不知道您是否需要一个具有唯一地址的列表,或者同一地址可能会显示多次,所以我将向您展示两种解决方案。

仅唯一地址

function extract() {
    test.forEach(cam => {
       const deviceAddress = cam.probeMatches.probeMatch.XAddrs;

       // only if the xaddrs is not in list yet, add it
       if(test.filter(xad => xad === deviceAddress).length <= 0) {
           xaddrs.push(cam.probeMatches.probeMatch.XAddrs);
       }
    }); 

    // show the number of addresses
    const listCount = xaddrs.length;
    console.log('listCount: ', listCount);
}

没有唯一地址

function extract() {
    test.forEach(cam => {
       xaddrs.push(cam.probeMatches.probeMatch.XAddrs);
    }); 

    // show the number of addresses
    const listCount = xaddrs.length;
    console.log('listCount: ', listCount);
}

答案 1 :(得分:0)

制作一个test数组并将push()个对象cam放入其中。还为您的XAddrs值定义一个数组。

var test = [];
var xaddrs = [];

// your other code
...

onvif.Discovery.on('device', function(cam,rinfo,xml){
    // function will be called as soon as NVT responses
    nombrecamera+=1;
    console.log(cam);

    // push cam object into array
    test.push(cam);

    cam2= JSON.stringify({cam}, null  , ' ');
    //console.log(cam2);
    STREAM.write(cam2);
    console.log(test);
});

然后解压缩XAddrs并将其推入xaddrs数组。

function extract() {
    test.forEach(cam => {
       xaddrs.push(cam.probeMatches.probeMatch.XAddrs);
    }); 

    // now you have an array containing only the XAddrs elements
    console.log(xaddrs);
}