如何使用旧数组中的数据创建新数组
How to create a new array using the data from the old one?
我想知道,是否可以从给定的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];
第一个和最后一个对象的值分别等于所有值1和值2的总和。所有其他对象都有一个值=值2和值1之间的差。
数据0可以具有不同的对象属性值,具体取决于报告的类型。
我需要它作为我在微战略中使用的d3瀑布图。因此,我不必对js代码做太多更改,只需添加一个代码来创建一个新的数组,就可以使用其中的数据构建可视化
我有csv格式的初始数据0:
id,value1,value2
name1,5,13
name2,2,5
name3,4,6
name4,3,7
据我所知,函数d3.csv以csv格式读取数据,就像json数据一样,将标题(第一行)作为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"answers"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
};
});
基本上,您可以将Array#map()
用于此任务。
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>');
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()在第一个项之前添加。
有许多不同的方法可以实现您需要的结果。其中之一是对数组项使用map
和reduce
函数。您可以在MDN上阅读更多关于map
和reduce
的信息。
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
- csv数据中的新数组
- javascript函数,它将数组作为输入,将每个数组元素增加1,并返回增加值的新数组
- 按值名称过滤掉重复的对象,并将其放入新数组中
- 根据对多个数组唯一的元素创建一个新数组
- 使用javascript/jquery从现有数组中创建一个新数组,该数组保存项目存在的次数
- Javascript-在一个数组中搜索整个单词,并创建一个符合条件的新数组
- 使用Node中的Q promise库对值数组顺序调用/执行相同的函数;并返回带有结果的新数组/集合
- 将数组值替换为循环以创建新数组
- 带有附加元素的新数组不会可视化
- 创建新数组和清除长度之间的差异
- 如何将新数组传递给函数
- 创建新数组或增加计数器
- 将字符串数组的子字符串复制到Javascript中的新数组中
- 如何使用旧数组中的数据创建新数组
- 如何过滤/修改主干集合本身,而不是获取新数组
- 如何比较具有相同值的两个数组并将该相同值存储在新数组中
- 将现有数组的元素复制到新数组而不使用拼接
- 如何将新数组添加到另一个数组的特定对象中
- 将一个新数组放入另一个数组中
- 为什么它在创建json对象时创建数组新数组