2016-09-01 14 views
12

Tôi đang làm việc với API twitter và tôi đang gặp phải vấn đề rất khó hiểu.Không thể truy cập mảng Javascript dưới dạng mảng

Tôi có kịch bản sau đây:

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

Đó là gọi hàm sau để tương tác với 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 
    ); 
}; 

dường như như tôi nhận được kết quả tôi muốn. Khi tôi đăng nhập kết quả, tôi nhận được kết quả sau:

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

Điều tuyệt vời, một loạt các tweet được giới hạn trong 1 tweet.

Sự cố tôi đang gặp phải là khi tôi cố truy cập mảng này.

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 

Tôi đọc lại thông qua api docs for the user_timeline nhưng trừ khi tôi hoàn toàn bỏ lỡ, tôi không thấy bất kỳ đề cập đến đầu ra đặc biệt nào.

Bất kỳ ý tưởng nào?

Cập nhật

Cảm ơn @nicematt vì đã chỉ ra câu trả lời đó.

Chỉ cần để xây dựng trên giải pháp, tôi cập nhật mã của tôi để này và bây giờ tôi nhận được kết quả tôi muốn:

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

Thanks for the help!

+5

'' 'JSON.parse (kết quả)' '' – rottenoats

+2

Có vẻ như rằng 'result' là một chuỗi, có thể là một chuỗi JSON ? – Teemu

+0

Vâng, đó có thể là lý do tại sao độ dài trả về 3506. – GuyT

Trả lời

16

Kết quả là một String và bạn đang lập chỉ mục đó (result[0] (trong khi 0 được chuyển thành một chuỗi), là gần như giống hệt nhau để result.charAt(0) dù), đây là lý do tại sao result[0] bằng "[" -because nó ký tự đầu tiên quy định tại Bạn quên phân tích cú pháp kết quả dưới dạng dữ liệu JSON.

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

result.textundefined từ result (một chuỗi) giống như một Object (nhưng không phải là instanceof) và cho phép tra cứu và thu khí xảy ra trong chính nó.

Tôi muốn thấy sự khác biệt giữa str[0]str.charAt(0), quá:

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

Đây là một trong những công cụ đầu cuối duy nhất mà tôi đã viết. Tôi thường thấy chuỗi đó xuất hiện trong giao diện điều khiển của trình duyệt và thấy rằng đó là một chuỗi. Cảm ơn bạn đã chỉ ra điều đó. Tôi đang thêm điều đó vào danh sách 'giữ liên lạc' của mình :) –

Các vấn đề liên quan