使用在函数内检索和更新的数据更新数组

我正在使用 .reduce 函数从数组中获取数据,我不确定这是否是最好的方法,但是由于我在另一篇文章中收到的一些帮助,这是目前唯一有效的方法。


我不知道如何使用函数中所做的更改来更新数组,返回数组会忽略所做的更改。


数据由路由器提供并每秒更新一次。


var data    =  [

 {  macProtocol: 'ip',

    ipProtocol: 'udp',

    dstAddress: '1.1.1.1',

    tx: '0',

    rx: '384'},

 {  macProtocol: 'ip',

    ipProtocol: 'udp',

    dstAddress: '8.8.8.8',

    tx: '384',

    rx: '384'},

 {  macProtocol: 'ip',

    ipProtocol: 'udp',

    dstAddress: '1.1.1.1',

    tx: '384',

    rx: '384',},

];



// We resolve the DNS and output the final array

let DNSvariable = result.reduce((arr, currentValue) => {


    var setIP = currentValue.dstAddress;


    var dns = require('dns');

    dns.setServers([

        '8.8.8.8', 

    ]);


    // Test that IP's are being received correctly. 

    console.log(setIP);


// Resolve the IP addresses

dns.reverse(setIP, (err, address) => {

     currentValue.dstAddress = address;


    // If I log the currentValue inside this function everything looks correct, it has updated the values in the full array. I need to push this array, into the returned array. 


});


return arr;

}, []);


// Logging the variable produces the array with the original IP

console.log(DNSvariable);

我想要 console.log(DNSvariable); 返回具有解析名称的数组,此时它正在返回地址。我只是不知道如何更新数组。


预期结果是:


var data    =  [

 {  macProtocol: 'ip',

    ipProtocol: 'udp',

    dstAddress: 'one.one.one.one',

    tx: '0',

    rx: '384'},

 {  macProtocol: 'ip',

    ipProtocol: 'udp',

    dstAddress: 'dns.google',

    tx: '384',

    rx: '384'},

 {  macProtocol: 'ip',

    ipProtocol: 'udp',

    dstAddress: 'one.one.one.one',

    tx: '384',

    rx: '384',},

];

如果有任何不正确或发布不正确,我深表歉意。


编辑:我使用 reduce 函数的原因是因为访问 dstAddress 的所有其他方法都没有以与 dns 函数一起使用的方式返回数据。这绝对不是正确的方法。


梦里花落0921
浏览 186回答 3
3回答

烙印99

如果你想使用reduce,那么代替return arr尝试return [...arr, currentValue]但是,我认为您最好提供地图:let DNSvariable = result.map((currentValue) => {    var setIP = currentValue.dstAddress;    var dns = require('dns');    dns.setServers([        '8.8.8.8',     ]);    dns.reverse(setIP, (err, address) => {        currentValue.dstAddress = address;    });    return currentValue;});我还建议将这些行移到您的函数之外,因为它们只需要调用一次。var dns = require('dns');dns.setServers([    '8.8.8.8', ]);

神不在的星期二

Reduce 看起来并不适合您的用例。我建议使用“地图”方法。例如,如果有一个数组,var arr1=[{a:1},{a:3},{a:4}]您需要另一个包含一些修改记录的数组:var arr2=arr1.map((elem)=>{   const elem2={...elem}  elem2.b=5;  return elem2;})console.log('Array1:',arr1)console.log('Array2:',arr2)结果:'Array1:' [ { a: 1 }, { a: 3 }, { a: 4 } ]'Array2:' [ { a: 1, b: 5 }, { a: 3, b: 5 }, { a: 4, b: 5 } ]

翻阅古今

首先,使用新的 Promises apiconst { Resolver } = require('dns').promises;const resolver = new Resolver();resolver.setServers(['8.8.8.8']);接下来,像这样解析所有地址:async function main() {    const promises = data.map(item => resolver.reverse(item.dstAddress));    const hostNames = await Promise.all(promises);    data.forEach((item, i) => {        item.dstAddress = hostNames[i];    });    console.log(data);}main();首先,我们构造一个包含所有解析 Promise 的数组。接下来我们等待所有 Promise 被解决。最后,我们.dstAddress用每个相应的结果覆盖。编辑:由于Promise.all如果单个 Promise 失败则失败,这里有一个包含dns.reverse在自定义 Promise 中的替代版本:const dns = require('dns');dns.setServers(['8.8.8.8']);const reverser = (ipAddress) => new Promise(resolve => {  dns.reverse(ipAddress, (err, hostname) => {    if (err) resolve(ipAddress);    else resolve(hostname);  });});如您所见,解析 IP 失败只会返回 IP;这样每个 Promise 都会解决,即使它dns.reverse自己失败了。像这样使用:async function main() {  const promises = data.map(item => reverser(item.dstAddress));  const hostnames = await Promise.all(promises);  data.forEach((item, i) => {    item.dstAddress = hostnames[i];  });  console.log(data);}main();
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript