为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

梦里花落0921 2021-10-14 13:21:56
我正在使用 .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 arraylet 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 addressesdns.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 IPconsole.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 函数一起使用的方式返回数据。这绝对不是正确的方法。
查看完整描述

3 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

如果你想使用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', 

]);


查看完整回答
反对 回复 2021-10-14
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

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 } ]


查看完整回答
反对 回复 2021-10-14
?
翻阅古今

TA贡献1780条经验 获得超5个赞

首先,使用新的 Promises api


const { 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();


查看完整回答
反对 回复 2021-10-14
  • 3 回答
  • 0 关注
  • 185 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信