javascript - 对象数组优化

标签 javascript arrays reactjs database

下面是我从服务器接收到的一组数据。

我需要从数据中找到哪个“id”连接到哪个“api”

我有下面的工作代码。

我的问题是......我是否以最有效的方式做到了?

我的策略如下:

第 1 步 - 捕获所有 api 并将它们保存到一个数组中

第 2 步 - 清除所有重复的 api

第 3 步 - for 循环比较 api 是否与 api 匹配

-如果为 true 则捕获该 ID

-否则将该 ID 存储在 api 2 上

(据了解我只有 2 个可能的 APIP)

第 4 步 - 清除所有重复的“id”

这是最好的方法吗?

var data = [{
  "time": "1571965891.8420029",
  "rssi": "30",
  "id": "123456789",
  "apip": "172.172.172.172.1"
}, {
  "time": "1571971066.8283374",
  "rssi": "30",
  "id": "100",
  "apip": "172.172.172.172.2"
}, {
  "time": "1571965476.4821894",
  "rssi": "30",
  "id": "123456789",
  "apip": "172.172.172.172.2"
}, {
  "time": "1571965894.140705",
  "rssi": "30",
  "id": "123456789",
  "apip": "172.172.172.172.2"
}, {
  "time": "1571965893.1654441",
  "rssi": "30",
  "id": "123456789",
  "apip": "172.172.172.172.1"
}, {
  "time": "1571970952.7499905",
  "rssi": "30",
  "id": "9999999",
  "apip": "172.172.172.172.1"
}, {
  "time": "1571965888.1338017",
  "rssi": "30",
  "id": "123456789",
  "apip": "172.172.172.172.2"
}, {
  "time": "1571970925.342063",
  "rssi": "30",
  "id": "66666",
  "apip": "172.172.172.172.1"
}, {
  "time": "1571965890.158157",
  "rssi": "30",
  "id": "123456789",
  "apip": "172.172.172.172.1"
}]

console.log(data)

var APs = [];
var dataFromAP1 = [];
var dataFromAP2 = [];
data.forEach(item => {
  APs.push(item.apip);
});
console.log(APs);
var uniq = [...new Set(APs)];
console.log(uniq);

data.forEach(item => {
  if (item.apip === uniq[0]) {
    dataFromAP1.push(item.id);
  } else {
    dataFromAP2.push(item.id);
  }
});

var uniqdataFromAP1 = [...new Set(dataFromAP1)];
console.log(uniqdataFromAP1);

var uniqdataFromAP2 = [...new Set(dataFromAP2)];
console.log(uniqdataFromAP2);

最佳答案

要找到 uniq 中的一个(我们称之为 oneApip),只需检查 data 的第一个元素 - 你不需要需要一个 Set 或迭代所有这些。然后遍历 data,并根据其 api 是否与 oneApip 匹配,将每个元素添加到一组或另一组:

var data=[{time:"1571965891.8420029",rssi:"30",id:"123456789",apip:"172.172.172.172.1"},{time:"1571971066.8283374",rssi:"30",id:"100",apip:"172.172.172.172.2"},{time:"1571965476.4821894",rssi:"30",id:"123456789",apip:"172.172.172.172.2"},{time:"1571965894.140705",rssi:"30",id:"123456789",apip:"172.172.172.172.2"},{time:"1571965893.1654441",rssi:"30",id:"123456789",apip:"172.172.172.172.1"},{time:"1571970952.7499905",rssi:"30",id:"9999999",apip:"172.172.172.172.1"},{time:"1571965888.1338017",rssi:"30",id:"123456789",apip:"172.172.172.172.2"},{time:"1571970925.342063",rssi:"30",id:"66666",apip:"172.172.172.172.1"},{time:"1571965890.158157",rssi:"30",id:"123456789",apip:"172.172.172.172.1"}];

const oneApip = data[0].apip;
const set1 = new Set();
const set2 = new Set();
for (const { apip, id } of data) {
  (apip === oneApip ? set1 : set2).add(id);
}
const uniq1 = [...set1];
const uniq2 = [...set2];
console.log(uniq1);
console.log(uniq2);

更一般地,对于任意数量的 api,创建一个由 api 索引的对象,其值是集合:

var data=[{time:"1571965891.8420029",rssi:"30",id:"123456789",apip:"172.172.172.172.1"},{time:"1571971066.8283374",rssi:"30",id:"100",apip:"172.172.172.172.2"},{time:"1571965476.4821894",rssi:"30",id:"123456789",apip:"172.172.172.172.2"},{time:"1571965894.140705",rssi:"30",id:"123456789",apip:"172.172.172.172.2"},{time:"1571965893.1654441",rssi:"30",id:"123456789",apip:"172.172.172.172.1"},{time:"1571970952.7499905",rssi:"30",id:"9999999",apip:"172.172.172.172.1"},{time:"1571965888.1338017",rssi:"30",id:"123456789",apip:"172.172.172.172.2"},{time:"1571970925.342063",rssi:"30",id:"66666",apip:"172.172.172.172.1"},{time:"1571965890.158157",rssi:"30",id:"123456789",apip:"172.172.172.172.1"}];

const grouped = {};
for (const { apip, id } of data) {
  if (!grouped[apip]) {
    grouped[apip] = new Set();
  }
  grouped[apip].add(id);
}
const arrs = Object.entries(grouped)
  .map(([apip, set]) => [apip, [...set]]);
console.log(arrs);

关于javascript - 对象数组优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58551823/

相关文章:

javascript - 无法使用 javascript 抓取 iframe 和框架集中的框架(域相同)

javascript - 在 Chrome 扩展程序中捕获 URL

javascript - 为什么 Backbone.js 路由器不能在 iOS 中工作?

javascript - 如何仅在读取整个数组而不是每个元素后才传递函数?

javascript - 将 getChildContext() 传递给 ReactJS 高阶组件会在 Webpack 中引发意外的 token 错误

reactjs - Webpack 错误 - 您可能需要适当的加载器来处理此文件类型,当前没有配置加载器来处理此文件

javascript - 如何在 Javascript 中访问对象数组值

ruby - 从 YAML 文件加载的 Ruby 数组是否保证保留其顺序?

javascript - 使用 JavaScript 自定义比较函数合并两个对象数组

javascript - 类型错误 : Cannot read property 'snippet' of undefined