Javascript将两个对象合并为具有唯一数据元素(即年份)的新对象

Javascript将两个对象合并为具有唯一数据元素(即年份)的新对象,javascript,arrays,Javascript,Arrays,我在JS中有以下两个对象,year在这两个对象中是唯一的。我想将它们组合成一个新对象,其中年份相同 var financials = [{"year": 2013, "rev_prod1": 10000, "rev_prod2": 5000}, {"year": 2014, "rev_prod1": 8000, "rev_prod2": 10000}, {"year": 2015, "rev_prod1": 15000, "rev_prod2": 20000}] var stats = [{"

我在JS中有以下两个对象,
year
在这两个对象中是唯一的。我想将它们组合成一个新对象,其中
年份
相同

var financials = [{"year": 2013, "rev_prod1": 10000, "rev_prod2": 5000}, {"year": 2014, "rev_prod1": 8000, "rev_prod2": 10000}, {"year": 2015, "rev_prod1": 15000, "rev_prod2": 20000}]

var stats = [{"year": 2013, "units_sold": 900, "hours": 55},{"year": 2014, "units_sold": 800, "hours": 45}, {"year": 2015, "units_sold": 1000, "hours": 70}]
预期输出如下所示:

var combinedData = [{"year": 2013, "rev_prod1": 10000, "rev_prod2": 5000, "units_sold": 900, "hours": 55}, {"year": 2014, "rev_prod1": 8000, "rev_prod2": 10000, "units_sold": 800, "hours": 45}, {"year": 2015, "rev_prod1": 15000, "rev_prod2": 20000, "units_sold": 1000, "hours": 70}]

您可以首先通过使用
#forEach()
合并类似对象来创建
哈希表
,然后使用
#map()
函数提取所需数组-请参见下面的演示:

var financials=[{“年”:2013年,“rev_prod1”:10000,“rev_prod2”:5000},{“年”:2014年,“rev_prod1”:8000,“rev_prod2”:10000},{“年”:2015年,“rev_prod1”:15000,“rev_prod2”:20000};
var统计=[{“年”:2013,“售出单位”:900,“小时”:55},{“年”:2014,“售出单位”:800,“小时”:45},{“年”:2015,“售出单位”:1000,“小时”:70}]
var hash={};
//函数创建哈希表
功能分类(e){
如果(散列[e.年]){
对象。键(e)。forEach(函数(c){
hash[e.year][c]=e[c];
});
}否则{
hash[e.year]=e;
}
}
//添加到散列
金融类。外汇(分类);
统计forEach(分类);
//提取结果
var result=Object.keys(散列).map(函数(e){
返回散列[e];
});
控制台日志(结果)

.as console wrapper{top:0;max height:100%!important;}
您可以对
stats
对象使用哈希表,并通过迭代键合并值

var financials=[{“年”:2013,“修订产品1”:10000,“修订产品2”:5000},{“年”:2014,“修订产品1”:8000,“修订产品2”:10000},{“年”:2015,“修订产品1”:15000,“修订产品2”:20000},
统计数据=[{“年”:2013,“售出单位”:900,“小时”:55},{“年”:2014,“售出单位”:800,“小时”:45},{“年”:2015,“售出单位”:1000,“小时”:70}],
hash=Object.create(null);
forEach统计(函数(o){
散列[o.year]=o;
});
财务.财务报告(职能(o){
Object.keys(hash[o.year]).forEach(函数(k){
o[k]=散列[o.year][k];
});
});
控制台日志(财务)

.as console wrapper{max height:100%!important;top:0;}
我已经编写了一个函数,用公共属性将2个列表分组,这就是您想要的吗

function commonProps(list1, list2, common) {
    var output = [], commons = {}, combined = list1.concat(list2)
    for(var i in combined){
        var item = combined[i], $index
        if(commons[item[common]] != null){
            $index = commons[item[common]]
            for(var j in item){
                output[$index][j] = item[j]
            }
        } else {
            commons[item[common]] = output.push(item) -1
        }
    }

    return output
}

您真的有一个具有重复密钥的对象吗<代码>“rev_prod1”:10000,“rev_prod1”:5000
另外,您尝试过什么?请添加您尝试过的内容。@NelsonYeung我的宽版上的拼写错误,现在已修复。我想你应该检查一下lodash merge。这可能会对你有所帮助:这只是天才的一招。我正在通过构建一些项目而不是阅读书籍来自学编程。我应该如何学习你刚才解释的那些概念?有书推荐吗?@Hannan,对不起,没有书,但是你可以在这里阅读一些问题和答案,这些问题和答案对解决一些问题有很好的想法。阅读说明书和示例总是一个好主意,如上所示。