我必须从rest api调用合并2个对象数组。
它们就像:[{date: date, name: name}, ...]
我们称它们为数组和B数组。
如果在A数组和B数组中具有相同的日期,那么最终的数组对象应该看起来像这样:[{date: date, nameA: nameA, nameB: nameB}]
如果他们不这样做,只需插入插入物和对象:[{date: dateA, nameA: nameA}]
例如:
arrayA = [
{
date: 2017-01-01,
name: 'New Year Eve'}
},
{
date: 2017-02-02,
name: 'feb2'
}
]
arrayB = [
{
date: 2017-01-01,
name: 'New Year Eve'}
},
{
date: 2017-03-03,
name: 'march3'
}
]
最终数组应如下所示:
finalArray = [{
date: 2017 - 01 - 01,
nameA: 'New Year Eve',
nameB: 'New Year Eve'
},
{
date: 2017 - 02 - 02,
nameA: 'feb2'
},
{
date: 2017 - 03 - 03,
nameB: 'march3'
}
共享日期的对象可以在数组中的不同位置,所以我不能像
一样检查arrayA[0].date === arrayB[0].date
答案 0 :(得分:1)
var finalArr = [];
for (var i = 0; i < arrayA.length; i++) {
for (var j = 0; j < arrayB.length; j++) {
if (arrayA[i].date == arrayB[j].date) {
//add to the final array if not exist that date
}
}
}
答案 1 :(得分:1)
有一些名为Array.prototype.concat()
的东西,它用于合并2个或更多的数组,在你的例子中它是这样的:
finalArray = arrayA.concat(arrayB)
然后你必须循环finalArray
,在获取其属性后删除任何重复的日期并合并到同一个日期:
for (var i = 0; i < finalArray.length; i++) {
if (finalArray[i]["date"] === finalArray[i+1]["date"] ) {
finalArray[i]["nameA"] = finalArray[i]["name"];
finalArray[i]["nameB"] = finalArray[i+1]["name"];
//delete the one that is repeated
delete finalArray[i+1][key]
}
}
希望有效
答案 2 :(得分:1)
您可以使用哈希表来引用具有相同日期的对象。
var arrayA = [{ date: '2017-01-01', name: 'New Year Eve' }, { date: '2017-02-02', name: 'feb2' }],
arrayB = [{ date: '2017-01-01', name: 'New Year Eve' }, { date: '2017-03-03', name: 'march3' }],
merged = function merge(arrays, names) {
var hash = Object.create(null),
result = [];
arrays.forEach(function (a, i) {
a.forEach(function (b) {
if (!hash[b.date]) {
hash[b.date] = { date: b.date };
result.push(hash[b.date]);
}
hash[b.date][names[i]] = b.name;
});
});
return result;
}([arrayA, arrayB], ['nameA', 'nameB']);
console.log(merged);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 3 :(得分:0)
您可以使用数组和减去长度
var arrayA = [{date: '2017-01-01', name: 'New Year Eve'},{date: '2017-02-02', name: 'feb2'}];var arrayB = [{date: '2017-01-01', name: 'New Year Eve'},{date: '2017-03-03',name: 'march3'}];
var arr= Array.from(new Array(arrayA.length+arrayB.length),(x,y)=> arrayB[y]||arrayA[y-arrayA.length] );
console.log(arr);