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

时间:2011-09-22 21:35:37

标签: javascript jquery arrays multidimensional-array flickr

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

我有兴趣从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,];

     });
});

我知道代码可能看起来很尴尬,但我已经尝试了所有内容,我无法理解这一点。

8 个答案:

答案 0 :(得分:15)

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

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

我相信您的数据包含一个名为“tags”的空格分隔字符串,其中包含标记和单个网址。

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

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

答案 1 :(得分: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
...

答案 2 :(得分: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/", ...],
    ...
//}

答案 3 :(得分:1)

在你的each

中也许是类似的东西
if ( imageArray[item.tags] != null ){
   imageArray[item.tags][imageArray[item.tags].length] = item.url_sq;
}else{
   imageArray[item.tags] = [];
}

答案 4 :(得分:1)

是的!我发现这很快。我可能会说,这可能是生成Ns长度的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

如果你想读更多;检查我的answerquestion

答案 5 :(得分: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);

 });

答案 6 :(得分:0)

您可以简单地将其用于2d js数组:

Test Num

答案 7 :(得分:0)

是的,有可能在javascript中具有多维数组。

这里是5x5矩阵的一线:

Array(5).fill(0).map(() => new Array(5).fill(0))

[...Array(5)].map(x=>Array(5).fill(0))