Можно ли создать пустой многомерный массив в javascript / jquery?

Я пытаюсь создать очень базовую галерею Flickr с помощью API Flickr. То, что я хочу достичь, - это сортировка моих фотографий по тегам. Я использую jQuery.getJSON (), чтобы я мог проанализировать ответ API flickr.фотосеты.getPhotos.

данные, которые я заинтересован в получении от 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,];

     });
});

Я знаю, что код может выглядеть неудобно, но я пробовал все, и нет никакого способа понять это.

6 ответов


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

Multi dimentional массивы имеют много пробелов, если они не используются должным образом. Двумерный массив называется матрицей.

Я считаю, что ваши данные содержат отдельную строку пространства под названием "теги", содержащую теги и один 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);

 });