Javascript 如何合并两个数组,类似于对象的下划线扩展方法

Javascript 如何合并两个数组,类似于对象的下划线扩展方法,javascript,arrays,sorting,date,underscore.js,Javascript,Arrays,Sorting,Date,Underscore.js,我有两个数组,其中格式化日期作为键,数字作为对应值 第一个数组给出了使用矩.js的最后七天,所有值都设置为零 第二个数组为我提供了上周的一些有意义的统计数据(如果有的话);在当前实例中,只有一天返回任何数字 我希望将第二个数组合并到第一个数组中并保留优先级,即初始时间段数组值将被第二个数组的值覆盖,然后返回一个用于图表绘制等的数组 我试图通过转换为对象并使用下划线扩展方法来实现这一点,但排序并没有保留,这很重要 以下是当前代码: var length = 7,

我有两个数组,其中格式化日期作为键,数字作为对应值

第一个数组给出了使用矩.js的最后七天,所有值都设置为零

第二个数组为我提供了上周的一些有意义的统计数据(如果有的话);在当前实例中,只有一天返回任何数字

我希望将第二个数组合并到第一个数组中并保留优先级,即初始时间段数组值将被第二个数组的值覆盖,然后返回一个用于图表绘制等的数组

我试图通过转换为对象并使用下划线扩展方法来实现这一点,但排序并没有保留,这很重要

以下是当前代码:

            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:

清洁