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

Я пытаюсь создать очень простую галерею Flickr, используя Flickr API. Я хочу сортировать свои фотографии по тегам. Я использую jQuery.getJSON (), чтобы я мог анализировать ответ API flickr.photosets.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,];

     });
});

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


person finferflu    schedule 22.09.2011    source источник
comment
Вы можете показать нам ответ и как он выглядит? Это значительно поможет.   -  person g.d.d.c    schedule 23.09.2011
comment
Это ответ: pastebin.com/S5g2zwwD   -  person finferflu    schedule 23.09.2011


Ответы (8)


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

Я не знаю, как он возвращает несколько тегов.

person Raynos    schedule 22.09.2011
comment
Моя проблема в том, что я не могу явно указать индекс массива. Я могу использовать только переменные, предоставленные циклом each(). Мне нужно было бы объявить массив многомерным вне цикла, когда ему еще ничего не было присвоено. Надеюсь это имеет смысл... - person finferflu; 23.09.2011
comment
@finferflu вы просто указываете объект и создаете значения, которые являются массивами. Затем вставьте URL-адрес изображения в массив. - person Raynos; 23.09.2011
comment
Вот и все! Большое спасибо :) Мой ответ был направлен на ваш исходный комментарий, поэтому он не имеет особого смысла по сравнению с вашим последним редактированием. - person finferflu; 23.09.2011
comment
Кроме того, я нашел функцию, которую можно использовать для установки размеров пустого многомерного массива. Было бы полезно добавить и эту информацию. - person Anderson Green; 22.07.2013

Я думаю, что синтаксис, который вы пытаетесь достичь, выглядит примерно так:

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
...
person Joseph Marikle    schedule 22.09.2011

В 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/", ...],
    ...
//}
person Peter C    schedule 22.09.2011
comment
@Raynos: Ну, это в основном то, что вы делаете в своем примере. Я украл ваш пример, чтобы продемонстрировать. :П - person Peter C; 23.09.2011

Может быть что-то подобное в вашем each:

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

Да, это! Я обнаружил, что это довольно быстро. Я мог бы растянуться, чтобы сказать, что это может быть самый быстрый способ сгенерировать 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

Если вы хотите узнать больше; проверьте мой ответ на этот question.

person Pimp Trizkit    schedule 24.09.2015

Я думаю, что что-то вроде этого должно делать то, что ты хочешь

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

 });
person Billy Moon    schedule 22.09.2011
comment
Зачем беспокоиться о проверке undefined. Это либо массив, либо неопределенный. Подойдет простой !imageArray[item.tags] - person Raynos; 23.09.2011

Вы можете просто попробовать это для массива 2d js:

let myArray = [[]];
person MUSTAPHA GHLISSI    schedule 25.12.2018

Да, в javascript можно использовать многомерные массивы.

Вот однострочники для матрицы 5x5:

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

Or

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

person Maksim Shamihulau    schedule 14.11.2019