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

Posted

技术标签:

【中文标题】是否可以在 javascript/jquery 中创建一个空的多维数组?【英文标题】:Is it possible to create an empty multidimensional array in javascript/jquery? 【发布时间】:2011-11-23 05:19:27 【问题描述】:

我正在尝试使用 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,];

     );
);

我知道代码可能看起来很尴尬,但我已经尝试了所有方法,但我无法弄清楚。

【问题讨论】:

你能告诉我们回复和它的样子吗?这将有很大帮助。 回复是:pastebin.com/S5g2zwwD 【参考方案1】:
var arr = [];
arr[0] = [];
arr[0][0] = [];
arr[0][0][0] = "3 dimentional array"

除非使用得当,否则多维数组会有很多空白。二维数组称为矩阵。

我相信您的数据包含一个名为“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", ...],
    ...
  
*/

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

【讨论】:

我的问题是我无法明确指定数组索引。我只能使用each() 循环提供的变量。当尚未分配任何内容时,我需要声明该数组是循环之外的多维数组。我希望这是有道理的...... @finferflu 您只需指定一个对象并创建数组值。然后将图片 url 推入数组中。 就是这样!非常感谢 :) 我的回复是针对您的原始评论,这就是为什么它与您上次的编辑没有多大意义。 另外,I've found a function 可用于设置空多维数组的维度。添加此信息也可能很有用。【参考方案2】:

我认为您尝试实现的语法类似于以下内容:

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

【讨论】:

【参考方案3】:

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

【讨论】:

@Raynos:嗯,这基本上就是您在示例中所做的。我偷了你的例子来帮助演示。 :P【参考方案4】:

你的each 中可能有类似的内容:

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

【讨论】:

【参考方案5】:

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

如果您想阅读更多内容;检查我的answer 到这个question。

【讨论】:

【参考方案6】:

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

这里是 5x5 矩阵的单行:

Array(5).fill(0).map(() =&gt; new Array(5).fill(0))

或者

[...Array(5)].map(x=&gt;Array(5).fill(0))

【讨论】:

【参考方案7】:

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

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

 );

【讨论】:

何必费心检查undefined。它要么是数组,要么是未定义的。一个简单的!imageArray[item.tags] 就可以了【参考方案8】:

你可以简单地试试这个二维 js 数组:

let myArray = [[]];

【讨论】:

以上是关于是否可以在 javascript/jquery 中创建一个空的多维数组?的主要内容,如果未能解决你的问题,请参考以下文章

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

是否可以使用 JavaScript/jQuery 解决这种情况? [复制]

是否有任何 JavaScript/jQuery 插件可以让我在播放歌曲达到特定播放时间时触发动作?

JavaScript/jQuery 等效于 LINQ Any()

javascript/jquery 输入验证

在 Javascript/JQuery 中选择单选选项时,是不是可以动态更改下拉列表的颜色或更改列表项的颜色?