2016-01-23 2 views
3

Я делаю простую приложение для Twitter, чтобы работать над своим javascript. Код, указанный ниже, должен идентифицировать каждое местоположение твитов и подсчитывать количество твитов на каждое местоположение.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

Вам нужно переписать обратного вызова:

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++; 
} 
+0

Спасибо! оно работает! Не могли бы вы рассказать мне, что здесь происходит? Я предполагаю, что есть индекс и что каждый твит проходит через него, но я не уверен. – nickfrenchy

+1

У вас есть массив объектов, но вы действовали как объект объектов. И indexof может работать только в том случае, если вы передадите туда тот же объект –

+1

'loc.loation.locCount' может работать, если у вас есть' var loc = {loation: {locCount: 1}}; ', и он не мог создать группировку' tweet.user.location'. –

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++ 
} 
Смежные вопросы