我想知道是否可以从给定的 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 的总和。所有其他对象都有一个 value = value2 和 value1 之间的差值。
根据报告的类型,data0 可以具有不同的对象属性值。
我在 Microstrategy 中使用的 d3 瀑布图需要它。因此,我不必对 js 代码进行太多更改,而只需添加代码来创建新数组,然后将使用其中的数据构建可视化。
我拥有的 csv 格式的初始数据:
id,value1,value2
name1,5,13
name2,2,5
name3,4,6
name4,3,7
据我了解,函数 d3.csv 像 json 数据一样读取 csv 格式的数据,将标题(第一行)作为 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;
}});
考虑到属性名称也可能不同(不是“value1”和“value2”),我该如何引用所有 value1 和 value2,并找到每个总和。我应该使用 i 和 j 的 for 循环吗?
任何帮助将不胜感激!
最佳答案
不确定您的 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
};
});
关于javascript - 如何使用旧数组中的数据创建一个新数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36178803/