Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将两个对象数组合并为一个数组,以便在Google图表中使用_Javascript_Arrays_Object_Google Visualization_Underscore.js - Fatal编程技术网

Javascript 将两个对象数组合并为一个数组,以便在Google图表中使用

Javascript 将两个对象数组合并为一个数组,以便在Google图表中使用,javascript,arrays,object,google-visualization,underscore.js,Javascript,Arrays,Object,Google Visualization,Underscore.js,在我开始之前,是的,我疯狂地在谷歌上搜索并阅读了很多答案,但我无法完成需要完成的事情,所以我正在寻求帮助 我有一个我无法解决的问题。我必须在谷歌注释图表中显示一些数据。我得到的数据格式如下: var arr1 = [{ timestamp: "1505735024496", value1: 2 }, { timestamp: "1505815355920", value1: 5 }, ..... ] var arr2 = [{ timestamp: "150538368

在我开始之前,是的,我疯狂地在谷歌上搜索并阅读了很多答案,但我无法完成需要完成的事情,所以我正在寻求帮助

我有一个我无法解决的问题。我必须在谷歌注释图表中显示一些数据。我得到的数据格式如下:

var arr1 = [{
    timestamp: "1505735024496", value1: 2
},
{
    timestamp: "1505815355920", value1: 5
},
.....
]

var arr2 = [{
    timestamp: "1505383687151", value2: 1
},
{
    timestamp: "1505485417374", value2: 3
},
.....
]
这里的最终目标是将这两个对象数组组合成如下数组:

var final = [
[new Date(YYYY, DD, MM), value1, value2], 
[new Date(YYYY, DD, MM), value1, value2], 
...
]
根据该特定图表上的说明

我只成功地将时间戳转换为完整日期,并为这些日期提供相应的值,但这再次为我提供了一个对象数组,我只是将时间戳转换为一个日期,没有做太多更改

var indexesArr1 = arr1.map(function (obj) {
  return obj.timestamp;
});

var arr1New = arr1.map(function (obj) {
  var index = indexesArr1.indexOf(obj.timestamp);
  return { date: moment(parseInt(obj.timestamp)).format('YYYY, MM, DD'), value1: index > -1 ? arr1[index].value : obj.value };
});
这里真正的问题是,arr1和arr2不必是相同的长度(并且可能在大多数情况下不会是相同的),而且由于此图表将随时间显示数据,因此使用value1和value2填充每个日期很重要,即使这些值中的一个可能不会在特定日期显式返回。还有一件事是删除所有重复日期的实例,但保留最后一个,因为该实例代表该特定日期的最后一个记录值

我已经使用Moment.js轻松地将时间戳转换为所需的格式(“YYYY,DD,MM”),但我无法正确地完成所有数据操作

允许使用,因为我知道它对这些类型的问题有一些很好的实用功能,但我就是无法解决它(老实说,我没有太多的经验),而且我知道这里有比我知识更多的人,所以我正在寻求帮助

提前感谢您花时间回答此问题


另外,我会链接到Moment.js,但我没有足够的声誉,目前发布的链接不超过2个。

建议从数组中创建两个google数据表

var arr1 = [{
  timestamp: "1505735024496", value1: 1
}, {
  timestamp: "1505735034496", value1: 2
}, {
  timestamp: "1505815355920", value1: 5
}];

var arr2 = [{
  timestamp: "1505383687151", value2: 1
}, {
  timestamp: "1505485417374", value2: 3
}];

var data1 = google.visualization.arrayToDataTable(arr1.map(function (row) {
  return [new Date(parseInt(row.timestamp)), row.value1];
}), true);

var data2 = google.visualization.arrayToDataTable(arr2.map(function (row) {
  return [new Date(parseInt(row.timestamp)), row.value2];
}), true);
然后可以在时间戳上连接数据表

var dataJoin = google.visualization.data.join(
  data1,
  data2,
  'full',
  [[0, 0]],
  [1],
  [1]
);
对于日期不匹配的每列,联接将使用
null
值,
可以使用数据视图将其替换为零

AnnotationChart不支持选项
interpolateNulls

其他图表,可以保留空值

要解决缺少和多个日期的问题,
使用数据表方法
getColumnRange
查找表中的最小和最大日期

然后从最小日期开始,直到最大日期,
使用数据表方法
getFilteredRows
检查介于
仅使用日期部分,删除时间值

如果日期不存在,请添加新行
如果日期存在多次,则删除除最后一次之外的所有日期

请参阅以下工作片段

google.charts.load('current'{
软件包:['annotationchart','table']
}).然后(函数(){
//日期格式化程序
var formatDate=new google.visualization.DateFormat({
模式:“yyyy-MM-dd”
});
//原始数组
变量arr1=[{
时间戳:“1505735024496”,值1:1
}, {
时间戳:“1505735034496”,值1:2
}, {
时间戳:“1505815355920”,值1:5
}];
var arr2=[{
时间戳:“1505383687151”,值2:1
}, {
时间戳:“1505485417374”,值2:3
}];
//为每个数组创建google数据表
var data1=google.visualization.arrayToDataTable(arr1.map)(函数(行){
返回[新日期(parseInt(row.timestamp)),row.value1];
}),对);
var data2=google.visualization.arrayToDataTable(arr2.map)(函数(行){
返回[新日期(parseInt(row.timestamp)),row.value2];
}),对);
//联接数据表
var dataJoin=google.visualization.data.join(
数据1,
数据2,
"满",,
[[0, 0]],
[1],
[1]
);
//对联接数据表进行排序,以确保最新日期为最后日期
排序([{列:0}]);
//一天时间
var一天=(1000*60*60*24);
//获取日期范围
var dateRange=dataJoin.getColumnRange(0);
//从最小和最大日期中删除时间值
var begDate=新日期(dateRange.min.getFullYear()、dateRange.min.getMonth()、dateRange.min.getDate());
var endDate=新日期(dateRange.max.getFullYear()、dateRange.max.getMonth()、dateRange.max.getDate());
//检查每个日期
for(var iDate=begDate.getTime();iDate=0;iRow=iRow-1){
dataJoin.removow(dateRows[iRow]);
}
}
}
排序([{列:0}]);
//将空值替换为零
var dataView=newgoogle.visualization.dataView(dataJoin);
dataView.setColumns([0{
计算:函数(dt,行){
返回dt.getValue(第1行)| 0;
},
标签:“y0”,
键入:“数字”
}, {
计算:函数(dt,行){
返回dt.getValue(第2行)| 0;
},
标签:“y1”,
键入:“数字”
}]);
//绘制注释图表
var containerChart=document.getElementById('chart_div');
var图表=新的google.visualization.AnnotationChart(containerChart);
图表绘制(数据视图);
//为测试目的绘制表格,“参见”数据
var containerTable=document.getElementById('table_div');
var table=新的google.visualization.table(containerTable);
table.draw(数据视图);
});

可能不是您问题的直接答案,但您是否想过使用时间戳作为对象键?在为现有对象指定新值时,像这样使用它要比循环使用它更有效

e、 g

这样,当您拉入新数据时,您可以直接将新的数据对象键与现有对象进行比较,并增加值或添加新的键对


这有帮助吗?不管怎样,我真的不明白你想做什么。。。我猜是直方图吗?@YvonneReinhardt不,我不是在寻找数组的浓缩。看看我链接到的google图表文档中的示例。不完全是直方图,但我想说的是价值时间线。你可以在财务图表上找到一些东西,比如y
let obj1 = {
    '34123812371293': 2,
  '12314981391230': 3,
}
let obj2 = {
    '13812381238123' : 1,
    '19312930812930' : 3,
  '12314981391230': 100,
}

let combinedObj = Object.assign({}, obj1);
Object.keys(obj2).map(o2 => {
    if(combinedObj[o2] != undefined){
    combinedObj[o2] += obj2[o2];
  }else{
    combinedObj[o2] = obj2[o2];
  }
});
console.log(combinedObj);