سؤال

هذا هو مقتطف الرمز الخاص بي ، حيث لا يدخل البرنامج حلقة Foreach:

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

عندما أقوم بتغيير مؤشرات الصفيف من السلاسل ("أنا" ، "أنت") إلى أعداد صحيحة ، فهي تعمل:

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

هل يمكنك مساعدتي في تنفيذ الحل للتكرار على المصفوفات مع جميع أنواع المؤشرات؟ هدفي هو تخزين القيم لكائنات التاريخ المحددة.


أستخدم البيانات لـ بروتوفيس المكتبة و AFAIK يحتاج إلى صفيف كمدخلات.

إن بنية البيانات التي أستخدمها في مثال Protovis أكثر تعقيدًا من هذا هو الموضح أعلاه.

في مشروعي ، أرسل عبر Javabean مجموعة من بعض الأشياء. يحتوي هذا الكائن على أشياء أخرى التاريخ. هدفي هو إظهار تلك الكائنات على الرسم البياني مثل هذا ، المقدمة على موقع protovis http: // vis.stanford.edu/protovis/ex/area.html.

سأستخدم المحور الأفقي للوقت ، والمحور العمودي لعدد الكائنات لفترة معينة. هذا هو السبب في أنني أرغب في فرز الصفيف حسب التاريخ ، لأن AFAIK Protovis لا يسمح فقط المصفوفات كإدخال بيانات للمخططات في الوضع الافتراضي - تسلسل الوظائف.

تحرير: الآن قمت بتغيير الطريقة. بدلاً من تخزين الأوتار كمفاتيح صفيف أقوم بمتابعتها: بموجب هذا ، فإن قصاصة الكود الأصلية الخاصة بي:
EDIT2: لقد أضفت بعض المدخلات الأصلية: var result2 = {"H": {10 "Documents": [11 {12 "BiographicalCategories": [13] بين وكالة المخابرات المركزية والجيش اليوناني لإنشاء شبكة حرب العصابات لمحاربة قوات حلف وارسو الغازية في حالة حرب. "، 15" واصفات ": [16] ، 17" ": 0 ، 20" العنوان الرئيسي ":" اليونان للتحقيق في خطة حرب العصابات "، 21" مواقع ": [22" اليونان "23] ، 24" أسماء ": [25] ، 26" 28 "onlinelocations": [29] ، 30 "تنظيمات عبر الإنترنت": [31] ، 32 "OnlinePeople": [33] ، 34 "onlinetitles": [35] ، 36 "منظمات": [37] ، 38 "People": [39] ، 40 "PublicationDate": "1990-11-21 00: 00: 00.0 CET" ، 41 "SourceFile": "0402635.xml" ، 42 "تصنيفيات تصنيفية": [43] ، 44 "ألقاب": [45 ] ، 46 "أنواع المواد": [47] ، 48 "نقاط": 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 أقوم بتخزين التاريخ ومجموعة الكائنات المتعلقة بهذا التاريخ. الجزء التالي من التعليمات البرمجية التي أستخدمها لفرز التواريخ من الأقدم إلى أحدث وفرز النتيجة بشكل مماثل. النسخة المصنفة من ResultTemp في صفيف النتيجة.

أقدم البيانات في البروتوفيس في الطريق التالي:


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

تبدو النتيجة المثالية: iimgur.com / wodya.png
لم أقم بتضمين رمز طباعة محاور X و Y وكذلك للتوسع من التاريخ إلى عرض الرسم البياني. يمكنك العثور على أمثلة على صفحة أمثلة Protovis.

راجع للشغل: أنا مرتبك لماذا في الجزء:

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

كآخر مفتاح أحصل عليه "يحتوي"؟ حاول العثور على إجابة على الإنترنت ، دون نجاح. أوضح بيرز في تعليقه أن السبب في أنني أحصل على هذا التحقيق هو أنني أتردد على خصائص الصفيف.

هل كانت مفيدة؟

المحلول

صفائف JavaScript تدعم الفهرسة فقط حسب الرقم. عندما تكتب

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

أنت تضيف خصائص مخصصة me و you إلى الصفيف أنت ليس إضافة عناصر إلى الصفيف. (أيضا باستخدام 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: لا تزال تبدو مختلطة حول المصفوفات مقابل الكائنات.

بخصوص "راجع للشغل": عندما تكتب for(key in tlk) ... أنت تكرر على المفاتيح الموجودة بالفعل في الصفيف. هذا يعامل الصفيف ككائن ، وهذا ليس ما تريد! هل ترى contains لأنك تكرر على خصائص مجموعة ، و contains هل وظيفة متصلة بكل صفيف (هل تستخدم النموذج الأولي ، أو مكتبة أخرى مماثلة؟).

المشكلة الأساسية ، مع ذلك ، هي أنك تفهرس في صفيف (tlk) باستخدام تاريخ. هذا كبير لا حتى لو tlk هو كائن ، لأنه يمكنك فقط فهرسة الكائنات باستخدام سلاسل. أنا حقًا لا أحصل على ما تفعله tlk, ، لكنني لا أعتقد أنك بحاجة إليها على الإطلاق. ما هو شكل بيانات الإدخال الخاصة بك؟ إذا تمكنت من إعطائي مثالًا صغيرًا على المدخلات ، فربما يمكنني أن أوضح لك ما يجب فعله به.

أيضًا ، يجب عليك حقًا استخدام Array and Object Distalals بدلاً من Array و Object المنشئون. على سبيل المثال ، استخدم var tlk = [] عوضا عن var tlk = new Array();, ، و var d = {}; عوضا عن var d = new Object();.

نصائح أخرى

JavaScript ليس لديه صفائف نقاط ، Par SE. وقد سمّت الكائنات خصائص ، وهي مشابهة. foreach () سوف تكرر فقط على الخصائص المفهرسة. أ for...in سوف تساعدك الحلقة هنا ، على الرغم من أنك ستتجنب استخدامها بشكل عام for...in في المصفوفات لان يكرر على الخصائص المسماة أيضا.

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

أنظر أيضا:

ال 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"، لن تكون الطريقة التي تريد تنفيذها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top