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

时间:2017-06-17 14:03:42

标签: javascript arrays object merge

我必须从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

4 个答案:

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