2011-09-22 14 views
9

Tôi đang cố gắng tạo một thư viện Flickr rất cơ bản bằng API Flickr. Những gì tôi muốn đạt được là phân loại hình ảnh của tôi bằng thẻ. Những gì tôi đang sử dụng là jQuery.getJSON() để tôi có thể phân tích cú pháp phản hồi API của flickr.photosets.getPhotos.Có thể tạo một mảng đa chiều rỗng trong javascript/jquery không?

Dữ liệu tôi quan tâm đến từ Flickr là thẻ và URL được liên kết với mỗi ảnh. Vấn đề với điều này là cách hợp lý duy nhất trong số này đối với tôi là tạo một mảng đa chiều theo định dạng sau:

Array['tag1'] => ['URL_1', 'URL_2', 'URL_3', 'URL_n']; 

Tuy nhiên, tôi không thể tìm được cách nào để đạt được điều này. Mã của tôi trông giống như sau:

$.getJSON('http://api.flickr.com/services/rest/?api_key=xxx&method=flickr.photosets.getPhotos&user_id=xxx&format=json&extras=tags%2C+url_l%2C+url_sq&nojsoncallback=1&photoset_id=xxx', 
    function(data) { 

    var imageArray = []; 
    $.each(data.photoset.photo, function(i, item) { 

     imageArray[item.tags] = [item.url_sq,]; 

    }); 
}); 

Tôi biết rằng mã có thể trông khó xử, nhưng tôi đã thử mọi thứ và không có cách nào tôi có thể hình dung điều này.

+0

Bạn có thể hiển thị phản hồi cho chúng tôi và phản hồi của nó không? Điều đó sẽ giúp ích đáng kể. –

+0

Đó là phản hồi: http://pastebin.com/S5g2zwwD – finferflu

Trả lời

14
var arr = []; 
arr[0] = []; 
arr[0][0] = []; 
arr[0][0][0] = "3 dimentional array" 

Mảng đa chiều có nhiều khoảng trống trừ khi chúng được sử dụng đúng cách. Mảng hai chiều được gọi là ma trận.

Tôi tin rằng dữ liệu của bạn chứa chuỗi không gian riêng biệt được gọi là "thẻ" chứa các thẻ và một url duy nhất.

var tagObject = {}; 
data.photoset.photo.forEach(function(val) { 
    val.tags.split(" ").forEach(function(tag) { 
    if (!tagObject[tag]) { 
     tagObject[tag] = []; 
    } 
    tagObject[tag].push(val.url_sq); 
    }); 
}); 
console.log(tagObject); 
/* 
    { 
    "sea": ["url1", "url2", ...], 
    "things": ["url4", ...], 
    ... 
    } 
*/ 

Tôi không biết nó trả về nhiều thẻ như thế nào.

+0

Vấn đề của tôi với điều này là tôi không thể chỉ định chỉ mục mảng một cách rõ ràng. Tôi chỉ có thể sử dụng các biến được cung cấp bởi vòng lặp 'each()'. Tôi sẽ cần phải khai báo rằng mảng là đa chiều bên ngoài vòng lặp, khi không có gì chưa được gán cho nó. Tôi hy vọng rằng có ý nghĩa ... – finferflu

+0

@finferflu bạn chỉ cần chỉ định một đối tượng và tạo các giá trị là mảng. Sau đó đẩy url hình ảnh vào mảng. – Raynos

+0

Đúng vậy! Cảm ơn rất nhiều :) Phản hồi của tôi đã được chuyển hướng đến nhận xét ban đầu của bạn, đó là lý do tại sao nó không có ý nghĩa nhiều liên quan đến chỉnh sửa cuối cùng của bạn. – finferflu

1

Tôi nghĩ rằng cú pháp bạn đang cố gắng để đạt được một cái gì đó như sau:

var item = {"tags":"blah","url_sq":"example.com"}; // for sake of example. 
var imageArray = []; 
$.each(data.photoset.photo, function(i, item) { 
    imageArray.push({"tags":item.tags,"url":item.url_sq}); 
}); 

và sau đó tham khảo nó như thế này:

imageArray[0].tags 
imageArray[0].url 
imageArray[1].tags 
imageArray[1].url 
... 
1

JavaScript không có mảng đa chiều thật (heck , nó thậm chí không có các mảng thông thường thực sự ...), nhưng, giống như hầu hết các ngôn ngữ, nó thay vì sử dụng mảng mảng. Tuy nhiên, với tôi có vẻ như bạn cần một đối tượng (tương tự như mảng của PHP) có chứa mảng.

var data = { 
    tag1: ['URL_1', 'URL_2', 'URL_3', 'URL_n'] 
}; 
// Then accessed like: 
data.tag1; // ['URL_1', ...] 
data.tag1[0]; // 'URL_1' 
data.tag1[1]; // 'URL_2' 
// etc. 

Vì vậy, bạn đang có vấn đề sẽ giống như thế này:

var tags = {}; 
$.each(data.photoset.photo, function (i, item) { 
    $.each(item.tags.split(" "), function (i, tag) { 
     if (!tags[tag]) 
      tags[tag] = []; 
     tags[tag].push(item.url_sq); 
    }); 
}); 
// tags is now something like: 
// { 
    "foo": ["/url.html", "/other-url/", ...], 
    "bar": ["/yes-im-a-lisp-programmer-and-thats-why-i-hypenate-things-that-others-might-underscore-or-camelcase/", ...], 
    ... 
//} 
+0

Không thực sự giúp giải quyết vấn đề – Raynos

+0

@Raynos: Vâng, đó là cơ bản những gì bạn làm trong ví dụ của bạn. Tôi lấy trộm ví dụ của bạn để giúp chứng minh. : P –

1

Có lẽ một cái gì đó như thế trong each của bạn:

if (imageArray[item.tags] != null){ 
    imageArray[item.tags][imageArray[item.tags].length] = item.url_sq; 
}else{ 
    imageArray[item.tags] = []; 
} 
0

Tôi nghĩ rằng một cái gì đó như thế này nên làm những gì bạn muốn

var imageArray = []; 

$.each(data.photoset.photo, function(i, item) { 

    // if the tag is new, then create an array 
    if(!imageArray[item.tags]) 
    imageArray[item.tags] = []; 

    // push the item url onto the tag 
    imageArray[item.tags].push(item.url_sq); 

}); 
+0

Tại sao phải bận tâm với một kiểm tra 'undefined'. Đó là một mảng hoặc không xác định. Một '! ImageArray [item.tags]' đơn giản sẽ làm – Raynos

1

Đúng vậy! Tôi thấy điều này khá nhanh. Tôi có thể kéo dài để nói rằng nó có thể là cách nhanh nhất có thể để tạo ra một mảng N chiều Ns chiều dài dẫn đến mảng trống bằng cách sử dụng JavaScript. (ví dụ: một số thứ nguyên tùy ý mỗi chiều dài tùy ý)

Mặc dù định nghĩa của một mảng trong JavaScript có sương mù là tốt nhất.

function createNDimArray(dimensions) { 
    var t, i = 0, s = dimensions[0], arr = new Array(s); 
    if (dimensions.length < 3) for (t = dimensions[1] ; i < s ;) arr[i++] = new Array(t); 
    else for (t = dimensions.slice(1) ; i < s ;) arr[i++] = createNDimArray(t); 
    return arr; 
} 

Công dụng:

var arr = createNDimArray([3, 2, 3]); 
// arr = [[[,,],[,,]],[[,,],[,,]],[[,,],[,,]]] 
console.log(arr[2][1]); // in FF: Array [ <3 empty slots> ] 
console.log("Falsy = " + (arr[2][1][0]?true:false)); // Falsy = false 

Nếu bạn quan tâm để đọc thêm; kiểm tra số answer của mình để xem số question này.