是否可以在javascript / jquery中创建一个空的多维数组?

我正在尝试使用Flickr API创建一个非常基本的Flickr库。 我想要实现的是按标签对照片进行排序。 我正在使用的是jQuery.getJSON(),以便我可以解析flickr.photosets.getPhotos的API响应。

我有兴趣从Flickr获取的数据是标签和与每张照片相关联的URL。 这个问题的唯一逻辑方法就是创建一个以下格式的多维数组:

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

我知道代码可能看起来很尴尬,但我已经尝试了所有的东西,我无法解决这个问题。

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

除非正确使用,否则多维arrays有很多间隙。 二维arrays称为矩阵。

我相信您的数据包含一个名为“tags”的空格分隔字符串,其中包含标记和单个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", ...], ... } */ 

我不知道它是如何返回多个标签的。

我认为您尝试实现的语法如下所示:

 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 ... 

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

也许each喜欢这样的东西:

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

是的! 我觉得这很快。 我可能会说,它可能是生成N维长度Ns数组的最快方法,导致使用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 

如果你想读更多; 检查我对这个问题的回答 。

我认为这样的事情应该做你想要的

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