2016-09-01 5 views
12

Ich arbeite mit der Twitter-API und ich bin ein wirklich verwirrendes Problem.Javascript-Array ist nicht als Array zugänglich

Ich habe das folgende Skript:

const Twitter = require('twitter-api-stream') 
const twitterCredentials = require('./credentials').twitter 

const twitterApi = new Twitter(twitterCredentials.consumerKey, twitterCredentials.consumerSecret, function(){ 
    console.log(arguments) 
}) 

twitterApi.getUsersTweets('everycolorbot', 1, twitterCredentials.accessToken, twitterCredentials.accessTokenSecret, (error, result) => { 
    if (error) { 
     console.error(error) 
    } 
    if (result) { 
     console.log(result) // outputs an array of json objects 
     console.log(result.length) //outputs 3506 for some reason (it's only an array of 1) 
     console.log(result[0]) // outputs a opening bracket ('[') 
     console.log(result[0].text) // outputs undefined 
    } 
}) 

, die die folgende Funktion mit Twitter zu interagieren ruft:

TwitterApi.prototype.getUsersTweets = function (screenName, statusCount, userAccessToken, userRefreshToken,cb) { 
    var count = statusCount || 10; 
    var screenName = screenName || ""; 

    _oauth.get(
     "https://api.twitter.com/1.1/statuses/user_timeline.json?count=" + count + "&screen_name=" + screenName 
     , userAccessToken 
     , userRefreshToken 
     , cb 
    ); 
}; 

Es scheint wie ich das Ergebnis, das ich will bekommen. Wenn ich das Ergebnis selbst einzuloggen bekomme ich folgende Ausgabe:

[ 
    { 
    "created_at": "Thu Sep 01 13:31:23 +0000 2016", 
    "id": 771339671632838656, 
    "id_str": "771339671632838656", 
    "text": "0xe07732", 
    "truncated": false, 
    ... 
    } 
] 

Das ist sehr gut, ein Array der auf 1 tweet begrenzt Tweets.

Das Problem, auf das ich stoße, ist, wenn ich versuche, auf dieses Array zuzugreifen.

console.log(result.length) //outputs 3506 for some reason (it's only an array of 1) 
console.log(result[0]) // outputs a opening bracket ('[') 
console.log(result[0].text) // outputs undefined 

las ich zurück durch die api docs for the user_timeline aber es sei denn, ich bin fehlt es vollständig bin ich keine Erwähnung besondere Ausgabe zu sehen.

Irgendwelche Ideen?

aktualisieren

Dank @nicematt für den Hinweis, dass die Antwort aus.

einfach auf die Lösung zu erarbeiten, ich meinen Code auf diese aktualisiert und nun das Ergebnis, das ich will ich erhalte:

if (result) { 
    let tweet = JSON.parse(result)[0] // parses the json and returns the first index 
    console.log(tweet.text) // outputs '0xe07732' 
} 

Danke für die Hilfe!

+5

'' 'JSON.parse (Ergebnisse)' '' – rottenoats

+2

Es scheint, dass 'result' ein String ist, vielleicht ein JSON-String ? – Teemu

+0

Yep, das ist wahrscheinlich, warum die Länge 3506 zurückgibt. – GuyT

Antwort

16

Ergebnis ist ein String und Sie es sind die Indizierung (result[0] (während 0 in einen String umgewandelt wird), ist aber fast identisch mit result.charAt(0)), deshalb result[0]-"[" gleich -weil es das erste Zeichen angegeben ist in Sie haben vergessen, das Ergebnis als JSON-Daten zu analysieren.

JSON.parse(result).length // probably 1 

Und result.text ist undefined seit result (String) wie ein Object ist (aber nicht instanceof) und erlauben Lookups und Getter an sich geschehen.

zeige ich würde den Unterschied zwischen str[0] und str.charAt(0) auch:

str[0] // same as str['0'], but a getter. 0 converts to 
     // string (because every key of an object 
     // is string in ECMAScript) 

str.charAt(0) // get/lookup String#charAt, call it 
       // without new `this` context and with arguments list: 0 
+1

Dies ist eines der ersten Terminal-only-Tools, die ich geschrieben habe. Ich bin es gewohnt zu sehen, dass die Zeichenfolge in der Konsole des Browsers erscheint und dass es sich um eine Zeichenfolge handelt. Danke, dass du darauf hingewiesen hast. Ich füge das in meiner "Keep-In-Mind" -Liste hinzu :) –

Verwandte Themen