как сравнить переменную с записями внутри массива - PullRequest
0 голосов
/ 22 февраля 2011

Вот моя проблема.

Я делаю небольшое погодное веб-приложение во флэш-памяти.Итак, я прочитал фид xml и скопировал из него массив данных.

мой xml похож на это

<xml>
<prevision>
<date>22</date>
<hour>5</hour>
<temperature>40</temperature>
</prevision>
<prevision>
<date>22</date>
<hour>10</hour>
<temperature>44</temperature>
</prevision>
<prevision>
<date>22</date>
<hour>14</hour>
<temperature>45</temperature>
</prevision>
<prevision>
<date>22</date>
<hour>20</hour>
<temperature>37</temperature>
</prevision>
</xml>

Итак, вот что я делаю с моим Actionscript 2

//**************************************
// Here i'm getting the current hour

var mytime = new Date();
var currenthour = mytime.getHours();

//*************************************
// Here i'm getting my XML

var myhour:Array = new Array();
var myxml:XML = new XML();
myxml.ignoreWhite = true;
myxml.onLoad = function(success)
{
dataextractor = myxml.firstChild.childNodes;
for (var j = 0; j < dataextractor.length; j++)
{
myhour.push(dataextractor[j].childNodes[1].firstChild.nodeValue);
}
// Doing this
trace(mydate);
}
// Will return this
// 5 , 10,  14 , 20

Теперь я хотел бы найти и отследить запись в массиве mydate со значением, наиболее подходящим для переменной «currenthour» (это мое текущее время, когда я становлюсь выше).

Например, если currenthour = 11 Если у меня массив myhour равный 5, 10, 14, 20 Лучшим совпадением будет myhour [1]

Может ли кто-нибудь помочь сделать это?myhour Array не имеет фиксированного количества записей.Иногда это может быть 5, 10, 14, а в другое время просто 14,20 и т. Д.

Большое спасибо,

Ответы [ 2 ]

0 голосов
/ 23 февраля 2011

Представьте свои числа в строке, от 0 до 24. Используя переменную для отслеживания наименьшего расстояния между текущими часами и каждым часом в вашем XML, вы можете найти индекс искомого узла:

import mx.xpath.XPathAPI;

var myxml:XML = new XML();
myxml.ignoreWhite = true;
myxml.onLoad = function(loaded:Boolean) {
    if (loaded) {
        var hoursMin:Number = 24;
        var hoursNow:Number = new Date().getUTCHours();
        var hourID:Number;
        var hours:Array = XPathAPI.selectNodeList(this.firstChild, "xml/prevision/hour");
        var hoursNum:Number = hours.length;
        for(var i:Number = 0 ; i < hoursNum; i++){
            var hoursDiff:Number = Math.abs(hoursNow - parseInt(hours[i].firstChild));//look for the 'shortest distance' within 24 numbers
            if(hoursDiff < hoursMin){//found the smallest current value
                hoursMin = hoursDiff;//update the minimum
                hourID = i;//store the node ID
            }
        }
        trace(this.firstChild.childNodes[hourID]);//access the closest node in time
    } else {
        trace("XML Load Error!!");
    }
}
myxml.load("feed.xml");

То же самое и без XPath, хотя я считаю, что получить доступ к узлам немного сложнее:

var myxml:XML = new XML();
myxml.ignoreWhite = true;
myxml.onLoad = function(loaded:Boolean) {
    if (loaded) {
        var hoursMin:Number = 24;
        var hoursNow:Number = new Date().getUTCHours();
        var hourID:Number;
        var hoursNum:Number = this.firstChild.childNodes.length;
        for(var i:Number = 0 ; i < hoursNum; i++){
            var hoursDiff:Number = Math.abs(hoursNow - parseInt(this.firstChild.childNodes[i].childNodes[1].firstChild));//look for the 'shortest distance' within 24 numbers
            if(hoursDiff < hoursMin){//found the smallest current value
                hoursMin = hoursDiff;//update the minimum
                hourID = i;//store the node ID
            }
        }
        trace(this.firstChild.childNodes[hourID]);//access the closest node in time
    } else {
        trace("XML Load Error!!");
    }
}
myxml.load("feed.xml");

HTH

0 голосов
/ 23 февраля 2011

Я не уверен, понял ли я вашу идею. Вам нужно найти ближайший номер к текущему часу из массива myhour?

Вот и все:

var minDiff : int = 12;
var diff : int;
var index : int = 0;   

for (var i : int = 0; i < myhour.length; i++)
{
    diff = Math.abs(myhour[i] - currenthour);
    if (diff > 12)
        diff = 24 - diff;
    if (diff < minDiff)
    {
        minDiff = diff;
        index = i;
    }
}

myhour[index] является результатом. Надеюсь, у меня есть идея.

...