2011-09-22 77 views
9

我正在嘗試使用Flickr API創建一個非常基本的Flickr圖庫。我想要實現的是通過標記排序我的圖片。我使用的是jQuery.getJSON(),以便我可以解析flickr.photosets.getPhotos的API響應。是否有可能在javascript/jquery中創建一個空的多維數組?

我有興趣從Flickr獲取的數據是標籤和與每張照片關聯的網址。這裏的問題是,我的唯一合乎邏輯的出路,這是創建以下格式的多維數組:

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

但是,我找不到任何方法來實現這一目標。我的代碼如下所示:

$.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,]; 

    }); 
}); 

我知道代碼看起來彆扭,但我已經竭盡所能,有沒有辦法,我可以算出來。

+0

你能告訴我們迴應和它的樣子嗎?這將有助於顯着。 –

+0

這就是迴應:http://pastebin.com/S5g2zwwD – finferflu

回答

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

多維數組有很多間隙,除非他們使用得當。二維數組稱爲矩陣。

我相信你的數據包含一個名爲「標籤」的空間單獨字符串,其中包含標籤和一個URL。

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

我不知道它是如何返回多個標籤的。

+0

我的問題是,我不能明確指定數組索引。我只能使用'each()'循環提供的變量。我需要聲明該數組在循環外部是多維的,當時還沒有分配給它。我希望這是有道理的...... – finferflu

+0

@finferflu你只需指定一個對象並創建數組即可。然後將圖像url推入數組中。 – Raynos

+0

就是這樣!非常感謝:) 我的回覆是針對您的原始評論,這就是爲什麼它與您最後一次編輯沒有太大關係。 – finferflu

1

我認爲你正試圖實現的語法類似如下:

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

,然後像這樣引用它:

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

JavaScript並沒有真正的多維數組(赫克,它甚至沒有真正的常規數組...),但是,與大多數語言一樣,它使用數組的數組。然而,對我來說,它看起來像你需要一個包含數組的對象(有點類似於PHP的數組)。

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. 

所以,你是問題將是這個樣子:

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

沒有真正幫助解決問題 – Raynos

+0

@Raynos:恩,基本上你在你的例子中做了什麼。我偷了你的例子來幫助證明。 :P –

1

也許類似的東西在你的each

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

我覺得這樣的事情應該做的事情,你想要

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

爲什麼要用「未定義」檢查。它可以是數組,也可以是未定義的。一個簡單的'!imageArray [item.tags]'會做 – Raynos

1

是的!我發現這很快。我可能會說,它可能是生成N維長度的N維數組的最快方式,從而導致使用JavaScript的空數組。 (即具有任意長度的任意數量的維度)

即使JavaScript中數組的定義最多也是模糊的。

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

用途:

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 

如果你願意讀更多;檢查我的answer到這個question

相關問題