Javascript - 创建新的数组而不是递增

3
我正在制作一个简单的 Twitter 应用程序,使用 JavaScript 进行开发。 下面的代码应该能够识别每个推文的位置,并计算每个位置的推文数。
然而,它没有递增计数,只是创建了一个新的数组。 我的代码有什么问题?我如何改进代码?
谢谢。
var Twitter = require('node-twitter'),
twit = {},
loc = [];

twit.count = 0;


var twitterStreamClient = new Twitter.StreamClient(
//credentials
);

twitterStreamClient.on('close', function () {
    console.log('Connection closed.');
});
twitterStreamClient.on('end', function () {
    console.log('End of Line.');
});
twitterStreamClient.on('error', function (error) {
    console.log('Error: ' + (error.code ? error.code + ' ' + error.message : error.message));
});
twitterStreamClient.on('tweet', function (tweet) {


    if (loc.indexOf(tweet.user.location) === -1) {
        loc.push({"location": tweet.user.location, "locCount": 1});
    } else {
        loc.loation.locCount = loc.loation.locCount + 1;
    }


    console.log(loc);

});

var search = twitterStreamClient.start(['snow']);
2个回答

2

您需要重新编写 on tweet 回调函数:

var index = loc.reduce(function(acc, current, curIndex) {
   return current.location == tweet.user.location ? curIndex : acc;
}, -1);

if (index === -1) {
    loc.push({"location": tweet.user.location, "locCount": 1});
} else {
    loc[index].locCount++;
}

谢谢!它正常工作了!你能告诉我这里发生了什么吗?我猜测这里有一个索引,每个推文都在它上面经过,但我不确定。 - nickfrenchy
1
你有一个对象数组,但是你把它当作了对象的数组。而且只有在你传递相同的对象时,indexof才能起作用。 - Dmitry Yaremenko
1
如果你有 var loc = { loation: { locCount: 1 } };,那么 loc.loation.locCount 可以工作,但它不能按 tweet.user.location 进行分组。 - Dmitry Yaremenko
1
如果所有浏览器都支持Array - find,您也可以使用它,但是在IE中不起作用:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find。这就是为什么我使用了`reduce`的原因。 - Dmitry Yaremenko

0

Array.indexOf并不像你想象的那样匹配。你正在创建一个新对象并将其推入数组中,无论它的属性是否与另一个对象完全匹配,它都不会===相等。相反,你必须手动查找:

var foundLoc;
for (var i = 0; i < loc.length; i++) {
  if (loc[i].location.x === location.x) 
     foundLoc = loc[i];
     break;
  }
}
if (!foundLoc) { 
  loc.push({location: location, count: 0});
} else {
  foundLoc.count++
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接