我有两个javascript数组,它们具有不同数量的属性,如下所示。
Arrary 1。
var arrFirst = [{
'name': 'A',
'date': "May-31-2012",
'value1': 56
}, {
'name': 'A',
'date': "Jun-05-2014",
'value1': 36
}, {
'name': 'A',
'date': "Nov-28-2015",
'value1': 29
}, {
'name': 'A',
'date': "Dec-01-2017",
'value1': 58
}];
数组2。
var arrSecond = [{
'date': "May-31-2012",
'value2': 26
}, {
'date': "Jun-05-2015",
'value2': 78
}, {
'date': "Nov-28-2015",
'value2': 560
}, {
'date': "Dec-01-2016",
'value2': 56
},
{
'date': "Dec-04-2016",
'value2': 36
}];
我想合并这两个数组并根据 date 创建一个数组。 结果数组应如下所示。
var resultArray = [{
'name': 'A',
'date': "May-31-2012",
'value1': 56,
'value2': 26
}, {
'name': 'A',
'date': "Jun-05-2014",
'value1': 36,
'value2' :0
},{
'name': 'A',
'date': "Jun-05-2015",
'value1': 0,
'value2' :78
}, {
'name': 'A',
'date': "Nov-28-2015",
'value1': 29,
'value2': 560
}, {
'name': 'A',
'date': "Dec-01-2016",
'value1': 0,
'value2' : 56
},{
'name': 'A',
'date': "Dec-01-2016",
'value1': 0,
'value2' : 56
},{
'name': 'A',
'date': "Dec-04-2016",
'value1': 0,
'value2' : 56
}];
请建议。
答案 0 :(得分:1)
您可以为非给定属性创建具有默认值的新对象,并迭代给定数据并使用哈希表将值分配到同一日期。
然后按日期对结果数组进行排序。
var arrFirst = [{ name: 'A', date: "May-31-2012", value1: 56 }, { name: 'A', date: "Jun-05-2014", value1: 36 }, { name: 'A', date: "Nov-28-2015", value1: 29 }, { name: 'A', date: "Dec-01-2017", value1: 58 }],
arrSecond = [{ date: "May-31-2012", value2: 26 }, { date: "Jun-05-2015", value2: 78 }, { date: "Nov-28-2015", value2: 560 }, { date: "Dec-01-2016", value2: 56 }, { date: "Dec-04-2016", value2: 36 }],
merged = [arrFirst, arrSecond].reduce(function (hash) {
return function (r, a) {
a.forEach(function (o) {
if (!hash[o.date]) {
hash[o.date] = { date: o.date, name: 'A', value1: 0, value2: 0 };
r.push(hash[o.date]);
}
Object.keys(o).forEach(function (k) {
hash[o.date][k] = o[k];
});
});
return r;
};
}(Object.create(null)), []);
merged.sort(function (a, b) {
function getISODate(s) {
var month = { Jan: '01', Feb: '02', Mar: '03', Apr: '04', May: '05', Jun: '06', Jul: '07', Aug: '08', Sep: '09', Oct: '10', Nov: '11', Dec: '12' };
return s.slice(7, 11) + '-' + month[s.slice(0, 3)] + '-' + s.slice(4, 6);
}
return getISODate(a.date).localeCompare(getISODate(b.date));
});
console.log(merged);

.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)
您可以使用以下功能合并2个数组
var arrFirst = [{
'name': 'A',
'date': "May-31-2012",
'value1': 56
}, {
'name': 'A',
'date': "Jun-05-2014",
'value1': 36
}, {
'name': 'A',
'date': "Nov-28-2015",
'value1': 29
}, {
'name': 'A',
'date': "Dec-01-2017",
'value1': 58
}];
var arrSecond = [{
'date': "May-31-2012",
'value2': 26
}, {
'date': "Jun-05-2015",
'value2': 78
}, {
'date': "Nov-28-2015",
'value2': 560
}, {
'date': "Dec-01-2016",
'value2': 56
}, {
'date': "Dec-04-2016",
'value2': 36
}];
function mergeArrays(arr1, arr2) {
var a1 = [];
if(arr1 && arr2) {
if(arr1.length >= arr2.length) {
arr1.forEach(function(e, k, i) {
a1.push(k);
a1[k] = [];
a1[k] = merge(e, arrSecond[k]);
});
} else {
arr2.forEach(function(e, k, i) {
a1.push(k);
a1[k] = [];
a1[k] = merge(e, arrFirst[k]);
});
}
} else {
if(arr1) {
a1 = arr1;
}
if(arr2) {
a1 = arr2;
}
}
return a1;
}
function merge(arr1, arr2) {
if(arr1 && arr2) {
return Object.assign(arr1, arr2);
} else {
if(arr1) {
return arr1;
}
if(arr2) {
return arr2;
}
}
}
console.log(mergeArrays(arrFirst, arrSecond));
然后将两个数组放到mergeArrays中,例如mergeArrays(arrFirst,arrSecond);它会给你合并的结果
你可以在这里看到现场演示
http://jsfiddle.net/jalayoza/eRjeZ/13/
希望这能帮到你
答案 2 :(得分:-1)
这会对你有所帮助。
{{1}}