合并两个在javascript中具有不同数量属性的数组

时间:2017-05-19 11:21:15

标签: javascript arrays

我有两个javascript数组,它们具有不同数量的属性,如下所示。

Arrary 1。

var arrFirst = [{
    'name': 'A',
    'date': "May-31-2012",
    'value1': 56
  }, {
    'name': 'A',
    'date': "Jun-05-2014",
    'value1': 36
  }, {
    'name': 'A',
    'date': "Nov-28-2015",
    'value1': 29
  }, {
    'name': 'A',
    'date': "Dec-01-2017",
    'value1': 58
  }];

数组2。

var arrSecond = [{
    'date': "May-31-2012",
    'value2': 26
  }, {
    'date': "Jun-05-2015",
    'value2': 78
  }, {
    'date': "Nov-28-2015",
    'value2': 560
  }, {
    'date': "Dec-01-2016",
    'value2': 56
  },
   {
    'date': "Dec-04-2016",
    'value2': 36
  }];

我想合并这两个数组并根据 date 创建一个数组。 结果数组应如下所示。

var resultArray = [{
    'name': 'A',
    'date': "May-31-2012",
    'value1': 56,
    'value2': 26
  }, {
    'name': 'A',
    'date': "Jun-05-2014",
    'value1': 36,
    'value2' :0
  },{
    'name': 'A',
    'date': "Jun-05-2015",
    'value1': 0,
    'value2' :78
  }, {
    'name': 'A',
    'date': "Nov-28-2015",
    'value1': 29,
    'value2': 560
  }, {
    'name': 'A',
    'date': "Dec-01-2016",
    'value1': 0,
    'value2' : 56
  },{
    'name': 'A',
    'date': "Dec-01-2016",
    'value1': 0,
    'value2' : 56
  },{
    'name': 'A',
    'date': "Dec-04-2016",
    'value1': 0,
    'value2' : 56
  }];

请建议。

3 个答案:

答案 0 :(得分:1)

您可以为非给定属性创建具有默认值的新对象,并迭代给定数据并使用哈希表将值分配到同一日期。

然后按日期对结果数组进行排序。



var arrFirst = [{ name: 'A', date: "May-31-2012", value1: 56 }, { name: 'A', date: "Jun-05-2014", value1: 36 }, { name: 'A', date: "Nov-28-2015", value1: 29 }, { name: 'A', date: "Dec-01-2017", value1: 58 }],
    arrSecond = [{ date: "May-31-2012", value2: 26 }, { date: "Jun-05-2015", value2: 78 }, { date: "Nov-28-2015", value2: 560 }, { date: "Dec-01-2016", value2: 56 }, { date: "Dec-04-2016", value2: 36 }],
    merged = [arrFirst, arrSecond].reduce(function (hash) {
        return function (r, a) {
            a.forEach(function (o) {
                if (!hash[o.date]) {
                    hash[o.date] = { date: o.date, name: 'A', value1: 0, value2: 0 };
                    r.push(hash[o.date]);
                }
                Object.keys(o).forEach(function (k) {
                    hash[o.date][k] = o[k];
                });
            });
            return r;
        };
    }(Object.create(null)), []);

merged.sort(function (a, b) {
    function getISODate(s) {
        var month = { Jan: '01', Feb: '02', Mar: '03', Apr: '04', May: '05', Jun: '06', Jul: '07', Aug: '08', Sep: '09', Oct: '10', Nov: '11', Dec: '12' };
        return s.slice(7, 11) + '-' + month[s.slice(0, 3)] + '-' + s.slice(4, 6);
    }
    return getISODate(a.date).localeCompare(getISODate(b.date));
});

console.log(merged);

.as-console-wrapper { max-height: 100% !important; top: 0; }




答案 1 :(得分:0)

您可以使用以下功能合并2个数组

     var arrFirst = [{
    'name': 'A',
    'date': "May-31-2012",
    'value1': 56
  }, {
    'name': 'A',
    'date': "Jun-05-2014",
    'value1': 36
  }, {
    'name': 'A',
    'date': "Nov-28-2015",
    'value1': 29
  }, {
    'name': 'A',
    'date': "Dec-01-2017",
    'value1': 58
  }];
    var arrSecond = [{
    'date': "May-31-2012",
    'value2': 26
  }, {
    'date': "Jun-05-2015",
    'value2': 78
  }, {
    'date': "Nov-28-2015",
    'value2': 560
  }, {
    'date': "Dec-01-2016",
    'value2': 56
  }, {
    'date': "Dec-04-2016",
    'value2': 36
  }];

function mergeArrays(arr1, arr2) {
            var a1 = [];
            if(arr1 && arr2) {
                if(arr1.length >= arr2.length) {
                  arr1.forEach(function(e, k, i) {
                    a1.push(k);
                    a1[k] = [];
                    a1[k] = merge(e, arrSecond[k]);
                  });
                } else {
                  arr2.forEach(function(e, k, i) {
                    a1.push(k);
                    a1[k] = [];
                    a1[k] = merge(e, arrFirst[k]);
                  });
                }
            } else {
                if(arr1) {
                a1 = arr1;
              }
              if(arr2) {
                a1 = arr2;
              }
            }
            return a1;
        }

function merge(arr1, arr2) {
    if(arr1 && arr2) {
    return Object.assign(arr1, arr2);
  } else {
    if(arr1) {
        return arr1;
    } 
    if(arr2) {
    return arr2;
    }
  }
}

console.log(mergeArrays(arrFirst, arrSecond));

然后将两个数组放到mergeArrays中,例如mergeArrays(arrFirst,arrSecond);它会给你合并的结果

你可以在这里看到现场演示

http://jsfiddle.net/jalayoza/eRjeZ/13/

希望这能帮到你

答案 2 :(得分:-1)

这会对你有所帮助。

{{1}}