Можно ли создать пустой многомерный массив в 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);
});