【问题标题】:What is the best way to concat/merge below two array without disturbing sort order?在不干扰排序顺序的情况下连接/合并两个数组以下的最佳方法是什么?
【发布时间】:2019-09-28 13:58:11
【问题描述】:

示例数组如下:

   var aa = [{date: "sep", data:[1,2,3]}, {date: "oct", data:[4,5,6]}];
   var bb = [{date: "oct", data:[1,2,3]}, {date: "nov", data:[40,50,60]}, {date: "dec", data:[41,51,61]}];

合并后的结果应该是这样的:

  var mergedArray =
 [
{date: "sep", data:[1,2,3]},
{date: "oct", data:[4,5,6,1,2,3]},
{date: "nov", data:[40,50,60]},
{date: "dec", data:[41,51,61]}
]

【问题讨论】:

  • 只是循环。显示您的代码。

标签: javascript arrays concatenation merging-data


【解决方案1】:

您可以使用.reduce() 将您的两个对象数组缩减为一个对象,其中对象的键是每个date,每个date 存储对整个对象的引用。但是,如果出现重复的日期(即:该日期已经存在于累积对象中),您可以改为将数组.concat() 放到已经存在的数组上。最后,使用我们最初创建的日期顺序数组,您可以将生成的对象映射到合并对象的数组中,如下所示:

const aa = [{date: "sep", data:[1,2,3]}, {date: "oct", data:[4,5,6]}];
const bb = [{date: "oct", data:[1,2,3]}, {date: "nov", data:[40,50,60]}, {date: "dec", data:[41,51,61]}];

const merged = [...aa, ...bb];
const order = [...new Set(merged.map(({date}) => date))];

const mergedObj = merged.reduce((acc, {date, data, ...rest }) => {
  acc[date] = acc[date] || {date, ...rest, data: []};
  acc[date].data = acc[date].data.concat(data);
  return acc;
}, {});

const res = order.map(key => mergedObj[key]);
console.log(res);

【讨论】:

    【解决方案2】:

    您可以在一个 for 循环中执行此操作。

      
      const aa = [{date: "sep", data:[1,2,3]}, {date: "oct", data:[4,5,6]}];
        const bb = [{date: "oct", data:[1,2,3]}, {date: "nov", data:[40,50,60]}, {date: "dec", data:[41,51,61]}];
        
        let tempArr = aa;
        
    bb.forEach(rec => { 
        let findIndex = tempArr.findIndex(obj => obj.date == rec.date);
        if(findIndex==-1){
           tempArr.push(rec);
           } else {
          tempArr[findIndex].data = tempArr[findIndex].data.concat(rec.data);
           }
        });
        console.log(tempArr);

    【讨论】:

      【解决方案3】:

      您可以使用Map 并按date 分组,然后将新对象作为结果集。

      var array1 = [{ date: "sep", data: [1, 2, 3] }, { date: "oct", data: [4, 5, 6] }],
          array2 = [{ date: "oct", data: [1, 2, 3] }, { date: "nov", data: [40, 50, 60] }, { date: "dec", data: [41, 51, 61] }],
          result = Array.from(
              [...array1, ...array2].reduce(
                  (m, { date, data }) => m.set(date, [...(m.get(date) || []), ...data]),
                  new Map
              ),
              ([date, data]) => ({ date, data })
          );
      
      console.log(result);
      .as-console-wrapper { max-height: 100% !important; top: 0; }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-16
        • 1970-01-01
        • 2010-09-09
        • 2019-03-21
        • 1970-01-01
        • 2017-07-02
        • 2018-03-20
        相关资源
        最近更新 更多