【问题标题】:How can I return a specific element out of an array in Javascript?如何从 Javascript 的数组中返回特定元素?
【发布时间】:2020-09-20 22:35:16
【问题描述】:

我正在尝试实现网络发现搜索,该搜索返回与我的本地网络链接的所有设备。 到目前为止,我的代码如下所示:

const find = require('local-devices');

// Find all local network devices.
find().then(devices => {
  console.log(devices);
})

并且控制台中返回的数组是这样的:

[
  { name: '?', ip: '192.168.0.174', mac: '00:17:88:65:f4:4d' },
  { name: '?', ip: '192.168.0.222', mac: '80:be:05:73:bc:g5' },
  { name: '?', ip: '192.168.0.190', mac: '0c:fe:45:4d:b8:28' }
]

所以,我已经知道我正在寻找的设备的 Mac 地址,我的问题是,如何在数组中搜索 mac 地址,并返回该设备的特定 IP 地址? 例如,我将 mac 地址“00:17:88:65:f4:4d”传递给函数,该函数应返回“192.168.0.174”,我可以将其保存在变量中并在以下代码中使用。

我也许可以使用 find() 函数解决这个问题,但是我如何告诉代码,我只想要 ip 地址,而不是保存数组的完整元素? 我想到了类似的东西:

const ip = devices.find('00:17:88:65:f4:4d'); 

但这只会返回完整的元素,如果语法正确的话。

【问题讨论】:

  • 你不能真正按照你的要求去做。您使用的包是异步的。您可以在.then() 回调内部识别设备,但不能将其包装在同步获取特定 IP 地址的函数中。
  • 现在我明白了,谢谢 Pointy 我删除了我的代码
  • 啊,我明白了问题所在。由于我没有立即填充所有 ip 地址的数组,并且它需要一些时间才能填充,我不能立即尝试从这个数组中找到一个 ip 地址?有没有类似“等待”的功能,它给代码 5 秒,直到它尝试执行以下命令?
  • 您不能将异步 API 变成同步 API。 JavaScript 中没有“等待”或“睡眠”。您必须构建您的代码以接受该语言的异步特性。

标签: javascript arrays search find


【解决方案1】:

如果语法正确

嗯,你的第一步是解决这个问题。也许:

const element = devices.find(d => d.mac === '00:17:88:65:f4:4d');

现在你应该有你正在寻找的元素(或null)。

这只会返回完整的元素

如果您只想要该元素的一个属性,请返回该属性:

return element ? element.ip : '';

在这里,如果没有找到匹配的元素,我会任意选择一个空字符串作为默认返回值。您可以将其替换为您想要的任何默认值,或保留返回值undefined


请注意,这里有 两个 find 实例,这可能会引起混淆。导入的find 被单独调用并返回Promise。在Promise 的回调中,我们在数组上使用.find

const find = require('local-devices');

find().then(devices => {
  const element = devices.find(d => d.mac === '00:17:88:65:f4:4d');
  console.log(element ? element.ip : '');
});

您是从承诺回调返回并在其他地方使用已解决的承诺,还是直接在此回调中使用结果值,取决于您的需要。单个函数将无法封装整个操作并同步返回您想要的值,但该函数可以返回解析为该值的 Promise,或者可以在 Promise 解析时接受回调以调用。

【讨论】:

  • 我很确定那个包是异步的,并且find() 函数返回一个 Promise。
  • @Pointy:这个.find()不是在第一个Promise返回的数组上吗?看起来这里涉及到两个finds。
【解决方案2】:
var devices = [
  { name: '?', ip: '192.168.0.174', mac: '00:17:88:65:f4:4d' },
  { name: '?', ip: '192.168.0.222', mac: '80:be:05:73:bc:g5' },
  { name: '?', ip: '192.168.0.190', mac: '0c:fe:45:4d:b8:28' }
];

const getIpFromMacAddress = macAddress => {
  for (let i = 0; i < devices.length; i++) {
    if (devices[i].mac === macAddress){
      return devices[i].ip
    }
  }
  return 'device not found'
}

getIpFromMacAddress('00:17:88:65:f4:4d') // "192.168.0.174"

【讨论】:

    【解决方案3】:

    对不起,我只是回复了这个答案,但注意到 Wais 已经在上面给出了相同的答案!这是一个使用 .forEach 而不是 for 循环的示例

    let details = [
      { name: '?', ip: '192.168.0.174', mac: '00:17:88:65:f4:4d' },
      { name: '?', ip: '192.168.0.222', mac: '80:be:05:73:bc:g5' },
      { name: '?', ip: '192.168.0.190', mac: '0c:fe:45:4d:b8:28' }
    ]
    
    details.forEach((item, index) => {
      if(item.mac === "80:be:05:73:bc:g5") {
        return item.ip;
      } 
    });

    【讨论】:

      【解决方案4】:

      以下是您可以通过经典方式执行此操作的方法:

      var devices = [
        { name: '?', ip: '192.168.0.174', mac: '00:17:88:65:f4:4d' },
        { name: '?', ip: '192.168.0.222', mac: '80:be:05:73:bc:g5' },
        { name: '?', ip: '192.168.0.190', mac: '0c:fe:45:4d:b8:28' }
      ]
      
      for(var i = 0; i < devices.length; i++) {
        if(devices[i].mac == "00:17:88:65:f4:4d") {
          return devices[i].ip;
        }
      }
      

      【讨论】:

      • 小心不要使用赋值运算符 - 应该使用 === 代替
      猜你喜欢
      • 1970-01-01
      • 2018-08-13
      • 2022-11-03
      • 2021-05-24
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-30
      相关资源
      最近更新 更多