从网络套接字创建数组并根据 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
变量的索引,因为每次您有一个新事件 data
,i
都会重置为 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);
});
});
所以我有这个项目,我从网络套接字收集位置数据。我需要找出哪个大陆的命中率最高。因此,为了做到这一点,我遍历了每个位置 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
变量的索引,因为每次您有一个新事件 data
,i
都会重置为 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);
});
});