Javascript 如何合并两个数组,类似于对象的下划线扩展方法
我有两个数组,其中格式化日期作为键,数字作为对应值 第一个数组给出了使用矩.js的最后七天,所有值都设置为零 第二个数组为我提供了上周的一些有意义的统计数据(如果有的话);在当前实例中,只有一天返回任何数字 我希望将第二个数组合并到第一个数组中并保留优先级,即初始时间段数组值将被第二个数组的值覆盖,然后返回一个用于图表绘制等的数组 我试图通过转换为对象并使用下划线扩展方法来实现这一点,但排序并没有保留,这很重要 以下是当前代码:Javascript 如何合并两个数组,类似于对象的下划线扩展方法,javascript,arrays,sorting,date,underscore.js,Javascript,Arrays,Sorting,Date,Underscore.js,我有两个数组,其中格式化日期作为键,数字作为对应值 第一个数组给出了使用矩.js的最后七天,所有值都设置为零 第二个数组为我提供了上周的一些有意义的统计数据(如果有的话);在当前实例中,只有一天返回任何数字 我希望将第二个数组合并到第一个数组中并保留优先级,即初始时间段数组值将被第二个数组的值覆盖,然后返回一个用于图表绘制等的数组 我试图通过转换为对象并使用下划线扩展方法来实现这一点,但排序并没有保留,这很重要 以下是当前代码: var length = 7,
var length = 7,
day = moment(),
arr = [];
while (length--) {
arr.push([day.subtract('days', length).format('D MMM'), 0]);
}
它返回过去七天的数组,例如
[["26 Nov", 0], ["27 Nov", 0]]...
然后我从数据库查询中得到以下信息:
[["26 Nov", 6]]
因此,我希望最终结果是:
[["26 Nov", 6], ["27 Nov", 0]]...
使用本机脚本
for(var i=0; i < newArray.length; i++){
var d=newArray[i][0];
for( var j= 0; j < oldArray.length ; j++){
if( oldArray[j][0] ===d){
oldArray[j][1] = newArray[i][1];
}
}
}
for(var i=0;i
使用本机脚本
for(var i=0; i < newArray.length; i++){
var d=newArray[i][0];
for( var j= 0; j < oldArray.length ; j++){
if( oldArray[j][0] ===d){
oldArray[j][1] = newArray[i][1];
}
}
}
for(var i=0;i
使用本机脚本
for(var i=0; i < newArray.length; i++){
var d=newArray[i][0];
for( var j= 0; j < oldArray.length ; j++){
if( oldArray[j][0] ===d){
oldArray[j][1] = newArray[i][1];
}
}
}
for(var i=0;i
使用本机脚本
for(var i=0; i < newArray.length; i++){
var d=newArray[i][0];
for( var j= 0; j < oldArray.length ; j++){
if( oldArray[j][0] ===d){
oldArray[j][1] = newArray[i][1];
}
}
}
for(var i=0;i
使用下划线/lodash可以执行类似操作,其中newArr
是数据库查询中的数据
merged= _.groupBy(_.union(arr, newArr),function(val){ return val[0]});
var out = _(merged).map(function(val, key) {
return ([key,_(val).reduce(function(m,x) { return m + x[1]; }, 0)]);
});
merged
是一个数组,其中所有重复日期(数组条目0)组合成一个条目,然后我们使用经典的map reduce,使用reduce
将所有值相加(数组条目1)
请注意,对于过去7天的数组,您可能更喜欢:
arr.push([day.subtract('days', 1).format('D MMM'), 0]);
性能
在这种情况下,@charliefl的解决方案大约比下划线快100倍(取决于浏览器)(lodash比下划线快2倍)。下面是一个比较下划线、lodash和纯JS解决方案的jsperf:
显然,有多种方法可以混合这两种解决方案,并获得不同的性能结果。我把它作为一个纯粹的lodash/下划线解决方案,只是为了显示一个端点,并将性能结果与Charlie的纯JS解决方案进行比较
更复杂的情况将改变性能平衡——任何人都可以创建自己的jsperf变体来探索这一点 使用下划线/lodash可以执行类似操作,其中
newArr
是数据库查询中的数据
merged= _.groupBy(_.union(arr, newArr),function(val){ return val[0]});
var out = _(merged).map(function(val, key) {
return ([key,_(val).reduce(function(m,x) { return m + x[1]; }, 0)]);
});
merged
是一个数组,其中所有重复日期(数组条目0)组合成一个条目,然后我们使用经典的map reduce,使用reduce
将所有值相加(数组条目1)
请注意,对于过去7天的数组,您可能更喜欢:
arr.push([day.subtract('days', 1).format('D MMM'), 0]);
性能
在这种情况下,@charliefl的解决方案大约比下划线快100倍(取决于浏览器)(lodash比下划线快2倍)。下面是一个比较下划线、lodash和纯JS解决方案的jsperf:
显然,有多种方法可以混合这两种解决方案,并获得不同的性能结果。我把它作为一个纯粹的lodash/下划线解决方案,只是为了显示一个端点,并将性能结果与Charlie的纯JS解决方案进行比较
更复杂的情况将改变性能平衡——任何人都可以创建自己的jsperf变体来探索这一点 使用下划线/lodash可以执行类似操作,其中
newArr
是数据库查询中的数据
merged= _.groupBy(_.union(arr, newArr),function(val){ return val[0]});
var out = _(merged).map(function(val, key) {
return ([key,_(val).reduce(function(m,x) { return m + x[1]; }, 0)]);
});
merged
是一个数组,其中所有重复日期(数组条目0)组合成一个条目,然后我们使用经典的map reduce,使用reduce
将所有值相加(数组条目1)
请注意,对于过去7天的数组,您可能更喜欢:
arr.push([day.subtract('days', 1).format('D MMM'), 0]);
性能
在这种情况下,@charliefl的解决方案大约比下划线快100倍(取决于浏览器)(lodash比下划线快2倍)。下面是一个比较下划线、lodash和纯JS解决方案的jsperf:
显然,有多种方法可以混合这两种解决方案,并获得不同的性能结果。我把它作为一个纯粹的lodash/下划线解决方案,只是为了显示一个端点,并将性能结果与Charlie的纯JS解决方案进行比较
更复杂的情况将改变性能平衡——任何人都可以创建自己的jsperf变体来探索这一点 使用下划线/lodash可以执行类似操作,其中
newArr
是数据库查询中的数据
merged= _.groupBy(_.union(arr, newArr),function(val){ return val[0]});
var out = _(merged).map(function(val, key) {
return ([key,_(val).reduce(function(m,x) { return m + x[1]; }, 0)]);
});
merged
是一个数组,其中所有重复日期(数组条目0)组合成一个条目,然后我们使用经典的map reduce,使用reduce
将所有值相加(数组条目1)
请注意,对于过去7天的数组,您可能更喜欢:
arr.push([day.subtract('days', 1).format('D MMM'), 0]);
性能
在这种情况下,@charliefl的解决方案大约比下划线快100倍(取决于浏览器)(lodash比下划线快2倍)。下面是一个比较下划线、lodash和纯JS解决方案的jsperf:
清洁