12 votes

Le tableau Javascript n'est pas accessible en tant que tableau

Je travaille avec l'API twitter et je rencontre un problème vraiment déroutant.

J'ai le script suivant :

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
    }
})

Qui appelle la fonction suivante pour interagir avec twitter :

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
    );
};

Il semble comme si j'obtenais le résultat que je voulais. Lorsque je consigne le résultat lui-même, j'obtiens la sortie suivante :

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

Ce qui est génial, un tableau des tweets limités à 1 tweet.

Le problème que je rencontre est lorsque j'essaie d'accéder à ce tableau.

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

J'ai relu les documents d'api pour la ligne de temps de l'utilisateur mais à moins que je ne l'aie complètement raté, je ne vois aucune mention de sortie spéciale.

Des idées ?

Mise à jour

Merci @nicematt de m'avoir signalé cette réponse.

Pour approfondir la solution, j'ai mis à jour mon code comme suit et j'obtiens maintenant le résultat que je souhaite :

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

Merci pour votre aide !

16voto

hydroper Points 1

Le résultat est un String et vous l'indexez ( result[0] (alors que 0 est converti en une chaîne de caractères), est presque identique à result.charAt(0) cependant), c'est pourquoi result[0] est égal à "[" -parce que c'est le premier caractère spécifié dans. Vous avez oublié d'analyser le résultat en tant que données JSON.

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

Et result.text es undefined depuis result (une chaîne) est comme un Object (mais n'est pas instanceof) et permet aux lookups et getters de se produire en lui-même.

Je montrerais la différence entre str[0] y str.charAt(0) aussi :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X