为什么/如何阻止它以NaN的形式返回?

时间:2018-08-02 14:43:41

标签: javascript arrays json nan

我正在一个带有Java后端的网站上,我正在创建图形,并使用从JSON作为数据从数据库拉到前端的数据。

一切正常,但是我现在试图获取每个数据点的总数,以便为该图添加一条额外的线以表示总数。

我在下面的循环旨在遍历一个包含对象的名为“系列”的列表,每个对象中的一个字段是一个数组(命名数据),该数组包含表示当天总销售额的数字。

var totalsArray = [];
//series is an array of objects
for(var q = 0; q < series.length; q++){
//data is an array found in each of those objects
    for(var w = 0; w < series[q].data.length; w++){

        totalsArray[w] += series[q].data[w];

    }
} 

但是,totalsArray最终充满了NaN。事情变得复杂的是,series.data []中可以包含不同数量的值。

仅需澄清一下:我试图获取每个对象数组中x位置的值,将它们加起来并存储在totalsArray的x位置。

谢谢大家是否需要进一步的帮助:)

我还使用console.log()查看series [q] .data [w],它们都是数字。

2 个答案:

答案 0 :(得分:1)

@Pointy

你是个天才伴侣,正好把我整理出来:

let createThrottler (delay: TimeSpan) =
    MailboxProcessor.Start(fun inbox ->
        let rec loop (lastCallTime: DateTime option) =
            async {
                let! (chan: AsyncReplyChannel<_>) = inbox.Receive()
                let sleepTime =
                    match lastCallTime with
                    | None -> 0
                    | Some time -> int((time - DateTime.Now + delay).TotalMilliseconds)
                if sleepTime > 0 then
                    do! Async.Sleep sleepTime
                let lastCallTime = DateTime.Now
                chan.Reply()
                return! loop(Some lastCallTime)
            }
        loop None)

let httpThrottler = createThrottler (TimeSpan.FromMilliseconds 1000.)

let httpRequestStringThrottled url = 
    async { 
        do! httpThrottler.PostAndAsyncReply id
        return! httpRequestStringAsync url
    }

// Test
[0..100] |> Seq.map (fun _ -> 
    let html = httpRequestStringThrottled "..." |> Async.RunSynchronize
    html) 

编辑:@Pointy如果您要点,请提出答案,我会接受

答案 1 :(得分:0)

以下是使用functional programming的答案:

//series is an array of objects
//data is an array found in each of those objects
totalsArray = series.map(s => (       
    s.data.reduce((t,d) => (t+=d), 0)
); 

使用mapreduce而不是嵌套的for循环。

reduce方法的第二个参数会将总数初始化为零。