如何使用旧数据创建新数组?

时间:2016-03-23 12:55:21

标签: javascript arrays d3.js

我想知道,是否可以从给定的json数据创建,例如:

data0 = [ {id: name1, value1: 5, value2: 13}, {id: name2, value1: 2, value2: 5}, {id: name3, value1: 4, value2: 6}, {id: name4, value1: 3, value2: 7} ];

以下数组,还有两个对象,例如:

var data = [ {id: sum1, value: 14}, {id: name1_, value: 8}, {id: name2_, value: 3 }, {id: name3_, value: 2}, {id: name4_, value: 4} {id: sum2, value: 31];

第一个和最后一个目标的值相等于所有value1和value2的总和。并且所有其他对象的值= value2和value1之间的差值。

data0可以具有不同的对象属性值,具体取决于报告的类型。

我需要在我的d3瀑布图中使用Microstrategy。因此,我不必经常更改js代码,只是添加代码来创建新数组,并使用来自它的数据构建可视化。

我用csv格式的初始数据:

id,value1,value2
name1,5,13
name2,2,5
name3,4,6
name4,3,7

据我所知,函数d3.csv像json数据一样读取csv formate中的数据,将标题(第一行)作为4个对象的属性(在本例中),其中每个后续行包含值每个对象的属性。

我使用以下代码调用数据集函数:

d3.csv("data0.csv", function(error, data) {
var values = d3.keys(data[0]).filter(function(key) {return key !== "id";});

data.forEach(function(d) {
for (var i = 0; i < values.length; i++) {
d.value = +d[values[i]];
return d;
}});

考虑到属性名称也可以不同(不是&#34; value1&#34;和&#34; value2&#34;),我想如何引用所有value1和value2,并找到每个总和。我可以用i和j进行循环吗?

任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:1)

不确定你的id是什么,因为你看起来像是在使用变量。在这种情况下,我将它们转换为字符串。享受!

代码可能是紧凑的,但我认为这将使你今后更具可读性。随意提出任何问题,很乐意提供帮助!

var data = [ 
  {
    id: 'name1', 
    value1: 5, 
    value2: 13
  }, 
  {
    id: 'name2', 
    value1: 2, 
    value2: 5
  }, 
  {
   id: 'name3', 
   value1: 4, 
   value2: 6
  }, 
  {
    id: 'name4', 
    value1: 3, 
    value2: 7
  } 
];

// Calculate sums
var value1Sum = 0;
var value2Sum = 0;

data.forEach(function(object) {
  value1Sum += object.value1;
  value2Sum += object.value2;
});

// Insert sums at front and back
data.unshift({
  id: 'sum1',
  value: value1Sum
});

data.push({
  id: 'sum2',
  value: value2Sum
});

// Calculate differences
data = data.map(function(object, idx) {
  if (idx === 0 || idx === data.length - 1) {
    return object;
  }
  
  return {
    id: object.id + '_',
    value: object.value2 - object.value1
  };
});

答案 1 :(得分:0)

data0 = [ {id: name1, value1: 5, value2: 13}, {id: name2, value1: 2, value2: 5}, {id: name3, value1: 4, value2: 6}, {id: name4, value1: 3, value2: 7} ];
var data = [];
var sum1 = 0;
var sum2 = 0; 
for (i = 0; i < data0.length; i++) {
  sum1 += data0[i].value1;
  sum2 += data0[i].value2;
  var diff = data0[i].value2 - data0[i].value1;
  data.push({id: 'name' + (i+1) + '_', value: diff});
}
data.unshift({id: 'sum1', value: sum1});
data.push({id: 'sum2', value: sum2});

Array.push()在数组的最后一项之后添加,在第一项之前添加Array.unshift()。

答案 2 :(得分:0)

基本上,您可以Array#map()执行此任务。

&#13;
&#13;
var data0 = [{ id: 'name1', value1: 5, value2: 13 }, { id: 'name2', value1: 2, value2: 5 }, { id: 'name3', value1: 4, value2: 6 }, { id: 'name4', value1: 3, value2: 7 }],
    result = function (array) {
        var sum1 = 0,
            sum2 = 0,
            r = array.map(function (a) {
                sum1 += a.value1;
                sum2 += a.value2;
                return { id: '_' + a.id, value: a.value2 - a.value1 };
            });
        return [{ id: 'sum1', value: sum1 }].concat(r, { id: 'sum2', value: sum2 });
    }(data0);

document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
&#13;
&#13;
&#13;

答案 3 :(得分:-1)

有许多不同的方法可以达到您所需的效果。其中之一是在数组项上使用mapreduce函数。您可以详细了解mapreduce on MDN

var  data0 = [ {id: 'name1', value1: 5, value2: 13}, {id: 'name2', value1: 2, value2: 5}, {id: 'name3', value1: 4, value2: 6}, {id: 'name4', value1: 3, value2: 7} ];

// calculate `sum1` and `sum2` as the sums of `value1` and `value2` respectively
var sums = data0.reduce(function (sums, item) {
    sums.sum1.value += item.value1;
    sums.sum2.value += item.value2;
    return sums;
}, {
    sum1: {id: 'sum1', value: 0},
    sum2: {id: 'sum2', value: 0}
});

// transform (map) the existing data and calculate `value` as a difference between `value2` and `value1`
var restOfData = data0.map(function (item) {
    return {
        id: item.id,
        value: item.value2 - item.value1
    };
});

// merge the obtained results into a single array
var data = [sums.sum1].concat(restOfData, [sums.sum2]);

document.write(JSON.stringify(data));

如果您使用ES2015,由于箭头功能和点差运算符,此代码更具可读性:http://codepen.io/mmiszy/pen/EKmmEy?editors=0010