【问题标题】:How to make one array of object from two array of objects with one shared key - JavaScript如何使用一个共享键从两个对象数组中创建一个对象数组 - JavaScript
【发布时间】:2017-06-17 14:03:42
【问题描述】:

我必须从 rest api 调用中合并 2 个对象数组。 他们就像:[{date: date, name: name}, ...] 我们称它们为 A 数组和 B 数组。

如果 A 数组和 B 数组中的日期相同,那么最终的 array-s 对象应该如下所示:[{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

【问题讨论】:

    标签: javascript arrays object merge


    【解决方案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; }

    【讨论】:

      【解决方案2】:
       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
              }
          }
      }
      

      【讨论】:

      • 我觉得这样比较有效。
      【解决方案3】:

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

      希望有效

      【讨论】:

      • 我觉得这个方案比较随意,但是很优雅
      • @GustavoAdolfo 谢谢你,这就是我认为的解决方案,但我知道会有一些错误,只是需要一些改进。
      • 嗯,这是个好主意,谢谢!但是在 concat 之后,相同的日期不会彼此跟随,以便能够像 i 和 i + 1 一样遍历 finalArray。例如,在实际请求和 concat 之后,'2016-03-28' 日期在 finalArray[ 5] 和 finalArray[13]
      • yub 我也注意到了,不幸的是它不起作用,但我认为它会让您了解它的工作原理@aboutus
      【解决方案4】:

      你可以使用数组从中减去长度

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-30
        • 2016-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多