【问题标题】:Javascript/jQuery Update DateJavascript/jQuery 更新日期
【发布时间】:2013-08-14 00:08:50
【问题描述】:

我编写了以下正常工作的代码,我正在创建一个新数组,该数组从数字中获取每两个成员并将它们相除。示例:

var numbers = [{ "name": "testvalue", "data": [10] }, 
               { "name": "testtotal", "data": [2]  }, 
               { "name": "prodvalue", "data": [10] }, 
               { "name": "prodtotal", "data": [2]  }];

var mydata = $.grep(numbers, function(e) {
    return new RegExp('^test*').test(e.name)
});

console.log(mydata) // prints [{"name": "testvalue", "data": [10]}, {"name": "testtotal", "data": [2]}]

result = [{
    "name": "testresult",
    "data": [mydata[0]["data"] / mydata[1]["data"]]
}];

console.log(result) // [{"name": "testresult", "data": [5]}]

我的问题是关于效率,我正在做的事情是高效的还是有更好的方法来做事? (我是 JS/jQuery 新手,这就是我要问的原因)。

我不关心数字的内容,我想要的只是每两个元素相除,每个元素名称以total或value结尾

按要求采样真实数据。特别是数据来自graphite/d3.json

var data = 
[ {"target": "xs12t11.Busy",  "datapoints": [34,54,65,76,87] }, 
  {"target": "xs12t11.Total", "datapoints": [34,54,2,12,33]} ];

【问题讨论】:

  • 你对numbers有控制权吗?如果是这样,有更好的方法来表示该结构。不太清楚你在这里做什么,部分原因是数组索引并没有提供那么多信息。
  • 是的,问题是这些数据来自 d3.json,不幸的是我无法控制,但基本上每个元素都有两个名为“total”和“value”的哈希
  • 另外我不能两次执行此请求,所以是的,我被卡住了。我的方法行得通,但我只是想在这里听取专家的意见。
  • 只要您的数据集很小或者您不经常搜索它,这不会影响您的性能。
  • 我有 43 个项目 (43*2)。我想按顺序执行它们 i/i+1 但我担心 d3.json 由于某种原因不会返回偶数条记录...

标签: javascript jquery d3.js graphite


【解决方案1】:

我仍然不能完全确定我理解您的要求。我提供了两个示例,它们遍历 data 并将其转换为结果。

给定以下可能包含奇数行的输入:

var data = 
[ {"target": "xs12t11.Busy",  "datapoints": [34,54,65,76,87] }, 
  {"target": "xs12t11.Total", "datapoints": [34,54,2,12,33]  }, 
  {"target": "xs12t12.Busy",  "datapoints": [34,54,2,12,33]} ];

示例 1 总结每行中的系列,并给出每对行的单个平均值的结果:

function sum(inArr) {
    var retVal = 0;

    for(var i = 0; i < inArr.length; ++i) retVal += inArr[i];
    return retVal;
}


var result = [];

// Increment by 2 to grab records in pairs
for(var i = 0; i < data.length; i += 2) {
    var series1 = data[i];
    var series2 = data[i+1];

    // Series1 always exists, but series2 may not
    if(!series2) break;

    result.push({
        name: series1.target.split('.')[0],
        data: sum(series1.datapoints)/sum(series2.datapoints)
    });
}

console.log(JSON.stringify(result));

输出

[{"name":"xs12t11","data":2.3407407407407406}]

示例 2 返回具有一系列平均值的每对行的结果:

function avgSeries(series1, series2) {
    var retVal = [];
    var len = Math.min(series1.length, series2.length);

    for(var i = 0; i < len; i++) retVal.push(series1[i]/series2[i]);
    return retVal;
}

var result = [];

// Increment by 2 to grab records in pairs
for(var i = 0; i < data.length; i += 2) {
    var series1 = data[i];
    var series2 = data[i+1];

    // Series1 always exists, but series2 may not
    if(!series2) break;

    result.push({
        name: series1.target.split('.')[0],
        data: avgSeries(series1.datapoints, series2.datapoints)
    });
}

console.log(JSON.stringify(result));

输出

[{"name":"xs12t11","data":[1,1,32.5,6.333333333333333,2.6363636363636362]}]

如果这些都不符合您的目标,请告诉我。

【讨论】:

  • 谢谢!这超出了我的预期:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 2014-07-19
相关资源
最近更新 更多