繁体   English   中英

如何使用一个共享密钥从两个对象数组中创建一个对象数组-JavaScript

[英]How to make one array of object from two array of objects with one shared key - JavaScript

我必须合并来自其余api调用的2个对象数组。 它们就像: [{date: date, name: name}, ...]让我们称它们为A数组和B数组。

如果A数组和B数组中的日期相同,则最终array-s对象应如下所示: [{date: date, nameA: nameA, nameB: nameB}]

如果他们不这样做,只需插入insert和对象,如下所示: [{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
 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
        }
    }
}

有一个叫做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]
                    }
        }

希望能奏效

您可以使用哈希表来引用具有相同日期的对象。

 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; } 

您可以使用数组减去长度

 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); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM