Подтвердить что ты не робот

Массив Javascript недоступен как массив

Я работаю с API twitter, и я сталкиваюсь с действительно запутанной проблемой.

У меня есть следующий script:

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 only an array of 1)
        console.log(result[0]) // outputs a opening bracket ('[')
        console.log(result[0].text) // outputs undefined
    }
})

который вызывает следующую функцию для взаимодействия с твиттером:

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

Кажется, я получаю результат, который я хочу. Когда я регистрирую результат, я получаю следующий вывод:

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

Это здорово, массив твитов, ограниченный одним твитом.

Проблема, с которой я сталкиваюсь, - это когда я пытаюсь получить доступ к этому массиву.

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

Я читаю обратно через api docs для user_timeline, но если я полностью не упущен, я не вижу упоминания о специальном выпуске,

Любые идеи?

Update

Спасибо @nicematt за указание на этот ответ.

Чтобы подробно остановиться на решении, я обновил свой код до этого, и теперь я получаю результат, который хочу:

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

Спасибо за помощь!

4b9b3361

Ответ 1

Результат String, и вы его индексируете (result[0] (тогда как 0 преобразуется в строку), почти идентичен result.charAt(0) хотя), поэтому result[0] равно "[" - потому что это первый символ, указанный в. Вы забыли проанализировать результат как данные JSON.

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

И result.text есть undefined, так как result (строка) похожа на Object (но не является экземпляром) и позволяет выполнять поиск и геттеры сами по себе.

Я бы показал разницу между str[0] и str.charAt(0) тоже:

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