从网络套接字创建数组并根据 Javascript 中的数组元素递增

Creating an array from web socket and incrementing based on array element in Javascript

所以我有这个项目,我从网络套接字收集位置数据。我需要找出哪个大陆的命中率最高。因此,为了做到这一点,我遍历了每个位置 object。现在这是我卡住的部分......生成动态数组并在每次位置 object 具有特定大陆时添加命中值的最佳方法是什么。

最初我有一个预定义大陆的 switch 语句,并检查大陆名称是否存在,如果存在,则它会增加该大陆的值。现在,我想使位置名称动态化,这使我的 switch 语句无法工作。

好的,这是我到目前为止的思考过程......一种方法可能是:创建一个空数组(假设是 continentArray),获取大陆名称,检查大陆名称是否存在于 continentArray 中,如果存在,则递增continentArray 中大陆的值。如果它不存在,则创建新的数组元素(在 continentArray 中)并增加值。

然后下一部分将在 3 x 2 列中显示此数据(HTML5 - 使用 Bootstrap)。我想我可以给每个 div header 一个 id(比如 rank1-5)然后每列内容一个单独的 id(比如 rankCont1-5)并根据每个数组键和值填充每个部分.

那会是最好的方法吗?...创建一个 object 而不是数组会更好吗?

我看到了这个 post 并认为必须有一种方法可以做类似的事情:

数据 object 的示例是:

{
   "country" : "US",
   "continent" : "North America"
}

到目前为止,这是我的代码:

var contArr = [];

socket.on('data', function(data)
  {
    //iterate through the socket data
    for(var i=0;i<data.length;++i){ 

      //define each iteration as item
      var item = data[i];

      //get current continent name
      var continent = item.continent;

      if (contArr[i] instanceof Array){
        contArr[i]['val']++;
        console.log(contArr[i]['val']);
      }
      else{
        contArr[i] = continent;
        contArr[i]['val'] = 1; 
         console.log(contArr[i]['val']);           
      }
    }
  });

现在它说 val 是未定义的,这是有道理的。我只是不确定你如何正确地做到这一点......

有什么建议吗?...

谢谢!

如果您想将信息存储在一个对象中,代码非常简洁。

var contHits = {};

socket.on('data', function(data)
  {
    //iterate through the socket data
    for(var i=0;i<data.length;++i){ 

      //define each iteration as item
      var item = data[i];

      //get current continent name
      var continent = item.continent;

      continent in contHits ? contHits[continent]++ : contHits[continent] = 1;
    }
  });

稍后创建 ui 时,您可以像这样获取 属性 名称和值

for(var name in contHits) {
    console.log(name);
    var value = contHits[name];
    console.log(value);
}

您不应该使用变量 i 作为 contArr 变量的索引,因为每次您有一个新事件 datai 都会重置为 0.

我会做这样的事情:

var allContinents = {}; // this is an object, not an array

socket.on('data', function(data) {

    //iterate through the socket data
    data.forEach(function (item, i) {

      if (!(item.continent in allContinents))
      {
        // we create the object if it doesn't exist yet
        // the object key is the contient name...
        allContinents[item.continent] = {
          continent: continent,
          val: 1,
        };
      }

      // ... so it's easy to retrieve the item using the same key
      allContinents[item.continent].val++;
      console.log(allContinents[item.continent].val);
    });

});