使用Angular.js / JavaScript对两个数组值进行排序并按日期合并

时间:2017-12-13 11:08:52

标签: javascript arrays angularjs

我有两个json数组,并且这两个数组都有date字段值。在这里,我需要比较数组和合并到一个数组。我的代码如下:

var firstArr=[{'name':'Ram','date':'2017-12-06'},{'name':'Raja','date':'2017-12-07'},{'name':'Rahul','date':'2017-12-08'}];

var secondArr=[{'model':'mmm','date':'2017-12-06'},{'model':'rrr','date':'2017-12-09'}];

这里我有两个数组,我需要按日期比较两个数组,并将两个值合并为一个数组。预期的输出如下:

var finalArr=[{'name':'Ram','date':'2017-12-06','model':'mmm'},{'name':'Raja','date':'2017-12-07','model':''},{'name':'Rahul','date':'2017-12-08','model':''},{'name':'','date':'2017-12-09','model':'rrr'}]

我的预期输出如上所示。我在尝试如下。

angular.forEach(firstArr,function(obj1){
            angular.forEach(secondArr.task,function(obj2){
                if (new Date(obj1.date)=== new Date(obj2.date)) {

                }
            })
        })

但是像这样我对这两个数组长度有点困惑,因为它可能/可能不一样。

5 个答案:

答案 0 :(得分:1)

我专注于JS部分,而不是角度版本。

逻辑

  • 由于您需要根据日期字符串合并对象,因此您可以创建一个hashMap,其中dateString为property,object为value。
  • 然后您可以使用Onject.assign合并对象。如果你不能,你甚至可以使用for..in循环或只有2个循环并手动设置特定属性。
  • 现在循环遍历此hashMap并检索分组对象。

<强>示例:

&#13;
&#13;
var firstArr=[{'name':'Ram','date':'2017-12-06'},{'name':'Raja','date':'2017-12-07'},{'name':'Rahul','date':'2017-12-08'}];

var secondArr=[{'model':'mmm','date':'2017-12-06'},{'model':'rrr','date':'2017-12-09'}];

var hashMap = {};
[firstArr, secondArr].forEach(function(arr) {
  arr.forEach(function(obj) {
    hashMap[obj.date] = Object.assign(Object.create(null), hashMap[obj.date] || {}, obj);
  })
});

var result = Object.keys(hashMap).map(x=> hashMap[x]);
console.log(result)
&#13;
&#13;
&#13;

答案 1 :(得分:1)

您可以使用waveform来获取具有相同日期的合并对象。在array#reduce内,合并具有相同日期的对象,然后使用array#reduce获取所有值。

&#13;
&#13;
Object.values()
&#13;
var firstArr=[{'name':'Ram','date':'2017-12-06'},{'name':'Raja','date':'2017-12-07'},{'name':'Rahul','date':'2017-12-08'}],
    secondArr=[{'model':'mmm','date':'2017-12-06'},{'model':'rrr','date':'2017-12-09'}];

var result = firstArr.concat(secondArr).reduce((r, o) => {
  r[o.date] = Object.assign({}, r[o.date] || {name:'', model: ''}, o);
  return r;
},{});

var output = Object.values(result);
console.log(output);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

试试这个

var finelArr = []
 angular.forEach(firstArr, function(val) {
     angular.forEach(secondArr, function(item) {
         if (val.date === item.date) {
             finelArr.push({ name: val.name, date: val.date, model: item.model })
         }
     })
 })

答案 3 :(得分:0)

试试这个。如果您不想修改原始阵列,则必须事先对其进行深度克隆。与爱迪生的解决方案相比,这也将包括第二个阵列中的项目。

var firstArr=[{'name':'Ram','date':'2017-12-06'},{'name':'Raja','date':'2017-12-07'},{'name':'Rahul','date':'2017-12-08'}];

var secondArr=[{'model':'mmm','date':'2017-12-06'},{'model':'rrr','date':'2017-12-09'}];

const newArr = (arr1, arr2) => {
  const finalArr = arr1.map((firstElement) => {
    firstElement.model = "";
    arr2.forEach((secondElement, index) => {
      if (secondElement.date === firstElement.date) {
        firstElement.model = secondElement.model;
        arr2.splice(index, 1);
       }
    });
    return firstElement;
  });
  arr2.forEach((element) => {
    element.name = "";
    finalArr.push(element);
  });
  return finalArr;
};

console.log(newArr(firstArr, secondArr));

答案 4 :(得分:0)

Angular是一个庞大的框架,拥有大型库,但只有在开始使用正确的语法之前才需要它。

此示例在控制器中无需编码即可工作:

&#13;
&#13;
var app = angular.module("app", []);

app.controller("ctrlA", function($scope) {
  var firstArr = [{
    'name': 'Ram',
    'date': '2017-12-06'
  }, {
    'name': 'Raja',
    'date': '2017-12-07'
  }, {
    'name': 'Rahul',
    'date': '2017-12-08'
  }];

  var secondArr = [{
    'model': 'mmm',
    'date': '2017-12-06'
  }, {
    'model': 'rrr',
    'date': '2017-12-09'
  }];

  $scope.ul = firstArr.concat(secondArr);

})
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app" ng-controller="ctrlA">
  <ul>
    <li ng-repeat="li in ul | orderBy:'date'">
      {{li.name ? li.name : li.model}} - {{li.date}}
    </li>
  </ul>
</div>
&#13;
&#13;
&#13;