2016-09-01 3 views
12

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

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

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

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

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, 
    ... 
    } 
] 

, который является большим, массив твитов ограничивается 1 твит.

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

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 

Я прочитал обратно через api docs for the 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' 
} 

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

+5

'' 'JSON.parse (результаты)' '' – rottenoats

+2

кажется, что 'result' является строкой, может быть строка JSON ? – Teemu

+0

Да, вероятно, поэтому длина возвращает 3506. – GuyT

ответ

16

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

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

И result.text является undefined так result (строка) подобно Object (но не InstanceOf) и позволяют поиски и добытчики произойдут сам по себе.

Я хотел бы показать разницу между 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 
+1

Это один из первых инструментов, которые я только что написал. Я привык видеть, что эта строка встречается в консоли браузера и видит, что это строка. Спасибо что подметил это. Я добавляю, что в моем списке «keep-in-mind» :) –

Смежные вопросы