0

これは私のコードスニペットで、プログラムはforeachループに入りません。

var ct = new Array();
ct["me"]= {"name" : "Jakub"};
ct["you"]= {"name" : "stack"};
ct.forEach(function (c){
    document.getElementById("tmp").appendChild(document.createTextNode(c));
});

配列のインデックスを文字列( "me"、 "you")から整数に変更すると、次のように機能します。

var ct = new Array();
ct[0]= {"name" : "Jakub"};
ct[1]= {"name" : "stack"};
ct.forEach(function (c){
    document.getElementById("tmp").appendChild(document.createTextNode(c));
});

あらゆる種類のインデックスを持つ配列を反復処理するソリューションを実装するのを手伝ってもらえますか?私の目的は、特定の日付オブジェクトの値を格納することです。


Protovisライブラリのデータを使用し、入力として配列が必要なAFAIKを使用します。

protovisの例で使用するデータ構造は、上記のデータ構造よりも複雑です。

私のプロジェクトでは、JavaBeanを介していくつかのオブジェクトのセットを送信します。これらのオブジェクトには、とりわけ日付が含まれています。私の目的は、protovis Webサイトhttp:// vis.stanford.edu / protovis / ex / area.htmlに表示されている、これらのオブジェクトをこのようなグラフに表示することです。

時間の横軸を使用し、特定の時間のオブジェクトの数の縦軸を使用します。これが、配列を日付でソートしたい理由です。AFAIKprotovisは、デフォルトモード(関数チェーン)でのダイアグラムのデータ入力として配列のみを許可するためです。

編集:今のところ私は方法を変更しました。文字列を配列キーとして保存する代わりに、次のようにします。これが私の元のコードスニペットです:
edit2:元の入力を追加しました:var result2 = {"h":{10 "documents":[11 {12 "biographicalCategories":[13]、14 "body":"ギリシャの保守的な政府は1955年の合意の調査を命じました戦争の際に侵入するワルシャワ協定軍と戦うためのゲリラネットワークの確立のためのCIAとギリシャ軍の間。"、15"記述子 ":[16]、17" generalOnlineDescriptors ":[18]、19" guid ":0、20"見出し":"ギリシャ戦争の計画を調査する"、21"場所":[22"ギリシャ "23]、24"名前 ":[25]、26" onlineDescriptors ":[27]、 28 "onlineLocations":[29]、30 "onlineOrganizations":[31]、32 "onlinePeople":[33]、34 "onlineTitles":[35]、36 "組織":[37]、38 "人":[39]、40 "publicationDate": "1990-11-21 00:00:00.0 CET"、41 "sourceFile" :"0402635.xml"、42 "taxonomicClassifiers":[43]、44 "titles":[45]、46 "typesOfMaterial":[47]、48 "score":0.80242133 49}、


var resultTmp = new Array();
var i = 0;
var averageScore = 0; 

var startDate = new Date();
var endDate = new Date(1700, 01, 01);
var docDate;
var actDate;

var tlk = new Array();
var av = 0;
var d = new Object();

result2.h.documents.forEach(function(c) {
    averageScore += c.score;
  if(typeof(c.publicationDate) != "undefined"){
    docDate = c.publicationDate.split("-");
    actDate = new Date(docDate[0], docDate[1]-1, docDate[2].split(" ")[0]);
    if(actDate  endDate){
        endDate = actDate;
    }
    if(defined(tlk[actDate])){
        av = tlk[actDate];
        resultTmp[av].docs.push(c);
    }
    else {
        d = new Object();
        d.date = actDate;
        d.docs = new Array();
        d.docs.push(c);
        resultTmp[i] = d;
        tlk[actDate] = i;
        i++;
    }
  }
});

i = 0;
var dates = [];
for(key in tlk){
    if(key )
        d = new Date(key);
    if(isValidDate(d)){
    dates[i] = new Date(key);
    i++;        
    }
}
dates.sort(function (a, b) {
    return a > b;
});

var ii = 0;
i = 0;
var ddocs;
var result = new Array();
for(i=0; i maxDocsPerDate){
            maxDocsPerDate = d.docs.length;
        } 
        result[i] = d;
}


edit3上記のコードは現在機能しています:

簡単に言うと、tlk配列を使用して、日付をインデックスに反映します。resultTmp配列の1つのインデックスについて、日付とその日付に関連するオブジェクトのセットを格納します。コードの次の部分では、日付を古いものから新しいものへと並べ替え、同様にresultTempを並べ替えます。resultTempのソートされたバージョンは、結果の配列にあります。

私は次の方法でprotovisでデータを提示します:


vis.add(pv.Line)
    .data(result)
    .lineWidth(2)
    .left(function(a) x(a.date))
    .bottom(function(a) y(a.docs.length))
    .add(pv.Dot)
    .lineWidth(function(a) a.docs.length - (a.docs.length-1)/3)
    .radius(function(a) a.docs.length * (a.docs.length/1.2))
    .fillStyle(function(a) color(a.docs.length))
    .event("click", function(a) Popup.show(a.docs))
    .anchor("top").add(pv.Label)
    .text(function(a) a.docs.length)
    .textBaseline("bottom");

vis.render();

例示的な結果は次のようになります。i.imgur.com/WODYA.pngx
軸とy軸を印刷するためのコード、および日付からグラフ幅にスケーリングするためのコードを含めませんでした。例は、protovisの例のページにあります。

ところで:私はその部分でなぜ混乱しています:

for(key in tlk){
    dates[i] = new Date(key);
    i++;
}

最後のキーとして、私は「含む」を取得しますか?インターネットで答えを見つけようとしましたが、成功しませんでした。Bearsは彼のコメントで、私がこのprobelmを取得する理由は、配列のプロパティを反復処理しているためだと説明しました。

4

3 に答える 3

2

JavaScriptには、それ自体、連想配列はありません。ただし、オブジェクトには名前付きのプロパティがありますが、これは似ています。 forEach()は、インデックス付きのプロパティに対してのみ反復します。ループはここで役立ちますが、名前付きプロパティも反復するためfor...in、一般的for...inに配列での使用は避けます。

for (var c in ct) {
    if (ct.hasOwnProperty(c)) {
        // do something
    }
}

参照:

于 2010-08-23T14:29:38.913 に答える
2

JavaScript配列は、数値によるインデックス作成のみをサポートします。あなたが書くとき

ct["me"]= {"name" : "Jakub"};
ct["you"]= {"name" : "stack"};

アドホックプロパティmeyou配列を追加します。配列に要素を追加していません。(また、new Array()コンストラクターの使用はちょっと奇妙です。配列が必要な場合は、[]リテラルを使用してください。)

配列ではなくJavaScriptオブジェクトを使用する必要があるようですが、文字列インデックスのみをサポートしていることに注意してください。

var ct = {};
ct['me'] = {name: 'Jakub'};
ct['you'] = {name: 'stack'};

for (var k in ct) {
    document.getElementById('tmp', appendChild(document.createTextNode(ct[k]));
}

編集:横軸を時間として扱いたい場合は、実際にはそれ以上の作業を行う必要はありません。ここに良い基本的な例があります; ページソースを表示してコードを確認します。ここでの秘訣は、データは実際には(オブジェクトの)配列ですが、x座標は、データ配列のインデックスではなく、プロパティとして明示的に記述されることです。配列の各要素は次のようになります。

>>> data[0]
    {x: /* some JavaScript date object */, y: /* some number */ }

出典:


編集2:あなたはまだ配列とオブジェクトについて混乱しているようです。

「BTW」について:書くfor(key in tlk) ...ときは、すでに配列にあるキーを繰り返し処理しています。それは配列をオブジェクトとして扱っています、そしてそれはあなたが望むものではありません!contains配列のプロパティを反復処理していて、containsすべての配列に関数がアタッチされているためです(プロトタイプ、または別の同様のライブラリを使用していますか?)。

tlkただし、基本的な問題は、日付を使用して配列()にインデックスを付けることです。それは大したことではありません。がオブジェクトであっても、文字列tlkを使用してのみオブジェクトにインデックスを付けることができるためです。私はあなたがしていることを本当に理解していませんが、あなたがそれを必要としているとはまったく思いません。入力データの形式は何ですか?入力の小さな例を教えていただければ、おそらくそれをどうするかをお見せすることができます。tlk

Arrayまた、Objectコンストラクターではなく、配列リテラルとオブジェクトリテラルを実際に使用する必要があります。たとえば、var tlk = []ではなくvar tlk = new Array();、およびvar d = {};ではなくを使用しますvar d = new Object();

于 2010-08-23T14:30:01.720 に答える
1

このArray.prototype.forEachメソッドは、数値インデックスで配列をトラバースします。

配列は「連想」ではありません。値を持つ名前付きプロパティが必要な場合は、単純なオブジェクトを使用し、for-inステートメントを使用して既存のプロパティを列挙する必要があります。

var ct = {};
ct["me"]= {"name" : "Jakub"};
ct["you"]= {"name" : "stack"};

for (var prop in ct) {
  if (ct.hasOwnProperty(prop)) {
    alert(ct[prop]);
  }
}

このhasOwnPropertyメソッドが呼び出されるのは、for-inステートメントが継承されたプロパティをトラバースするためです。このようにして、オブジェクトに物理的に存在するプロパティ(独自のプロパティ)のみが列挙されます。

オブジェクトに「 」という名前のプロパティがある場合、実行するメソッドではないため、if (Object.prototype.hasOwnProperty.call(ct, prop))代わりにを使用if (ct.hasOwnProperty(prop))して安全性を高めることができます。hasOwnProperty

于 2010-08-23T14:30:26.213 に答える