FlickrAPIを使用して非常に基本的な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,];
});
});
コードがぎこちなく見えるかもしれないことは承知していますが、私はすべてを試しましたが、これを理解する方法はありません。
var arr = [];
arr[0] = [];
arr[0][0] = [];
arr[0][0][0] = "3 dimentional array"
多次元配列は、適切に使用されない限り、多くのギャップがあります。 2次元配列は行列と呼ばれます。
あなたのデータには、タグと単一の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には真の多次元配列はありませんが(まあ、真の通常の配列すらありません...)、ほとんどの言語と同様に、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] = [];
}
はい、そうです!これは非常に高速であることがわかりました。 JavaScriptを使用して空の配列を生成するNsの長さのN次元配列を生成することが可能な最速の方法である可能性があると言っても過言ではありません。 (つまり、それぞれが任意の長さの任意の数の次元)
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
あなたは単に2djs配列のためにこれを試すことができます:
let myArray = [[]];
はい、JavaScriptで多次元配列を持つことは可能です。
5x5マトリックスのワンライナーは次のとおりです。
Array(5).fill(0).map(() => new Array(5).fill(0))
または
[...Array(5)].map(x=>Array(5).fill(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);
});