在JavaScript中组合来自两个多维数组的元素
Combine elements from two multidimensional arrays in JavaScript
我在JavaScript中有以下两个数组:
"total":[[1370923200000,"66"],[1371009600000,"42"],[1371096000000,"23"]]
"successful":[[1370923200000,"5"],[1371096000000,"2"],[1371182400000,"0"]]
我想把它们组合成一个数组/对象,看起来像这样:
{date:1370923200000, total:"66", successful:"5"},
{date:1371009600000, total:"42"},
{date:1371096000000, total:"23", successful:"2"},
{date:1371182400000, successful:"0"}
我尝试了多种不同的解决方案,在两个数组中循环,但似乎找不到一个优雅的解决方案。
这里有:
var total = [[1370923200000, "66"],[1371009600000, "42"],[1371096000000, "23"]];
var successful = [[1370923200000, "5"],[1371096000000, "2"],[1371182400000, "0"]];
var combined = {};
for(var i=0; i<total.length; i++){
combined[total[i][0]] = {date: total[i][0], total: total[i][1]};
}
for(var i=0; i<successful.length; i++){
if(successful[i][0] in combined){
combined[successful[i][0]].successful = successful[i][1];
}
else{
combined[successful[i][0]] = {
date: successful[i][0], successful: successful[i][1]
};
}
}
var result = [];
for(var key in combined){
result.push(combined[key]);
}
alert(result.toSource());
还有一把正在工作的小提琴http://jsfiddle.net/eRjeZ/
n个阵列的简单解决方案:
var arrays = {"total":[…], "successful":[…]};
var result = [];
for (var prop in arrays) {
var arr = arrays[prop];
var i=0;
for (var j=0; j<arr.length; j++) {
var date = arr[j][0];
while (i < result.length && date > result[i].date) i++;
if (i < result.length && date == result[i].date) {
result[i][prop] = arr[j][1];
} else {
var o = {date:date};
o[prop] = arr[j][1];
result.splice(i, 0, o);
}
}
}
如果您需要更快的速度,您可以使用使用二进制堆的多阵列合并(另请参阅N路合并的算法)。如果您只有两个列表,请查看合并两个对象数组的最有效方法。
var total = [[1370923200000, "66"],[1371009600000, "42"],[1371096000000, "23"]];
var succes = [[1370923200000, "5"],[1371096000000, "2"],[1371182400000, "0"]];
var everything = {};
var output = [];
total.map( function( item ){ addToEverything( item , "total" ) } );
succes.map( function( item ){ addToEverything( item , "successful" ) } );
console.log( everything ); // This looks 'like' what you want, but better
for( var key in everything )
output.push( everything[key] );
console.log( output ); //This looks exactly like what you want
function addToEverything( item , name )
{
var key = item[0];
var entry = everything[key] || { date : key };
entry[name] = item[1];
everything[key] = entry;
}
相关文章:
- 如何使用 node.js 比较两个 json 数组
- 用每小时的差值填充数组/列表-从下拉列表中给定两个时间值
- 访问$.ajax()函数中的两个不同数组
- 正在更新mongod中两个对象内部的数组
- 如何使用javascript合并两个对象数组
- 比较包含多个值对的两个JavaScript数组
- jQuery对象从html表中查询为两个一维数组,用于Chartist图表
- 检查来自不同数组的两个元素的一个属性是否相等
- 如何在javascript中合并两个对象数组
- JavaScript - 合并两个对象数组并根据属性值删除重复数据
- 效率:整数数组的一个子集中两个项之间的最大差值
- 将两个值组合成extjs 4.1的形式
- 如何将中的两个geoJSON功能集合添加到两个层组中
- 在 JQuery 验证中验证多个“数组命名”文件输入和下拉列表
- 在一个区间之间生成两个随机数组
- 使用两个捕获组和JavaScript的replace()函数
- 通过找到两个重复组之一的正则表达式组
- 从Javascript中的两个子数组中获取随机结果
- 如何在一个可选的非捕获组中创建两个捕获组
- paper.js:获取两个层/组的原始像素数据