我有两个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)) {
}
})
})
但是像这样我对这两个数组长度有点困惑,因为它可能/可能不一样。
答案 0 :(得分:1)
我专注于JS部分,而不是角度版本。
Onject.assign
合并对象。如果你不能,你甚至可以使用for..in
循环或只有2个循环并手动设置特定属性。<强>示例:强>
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;
答案 1 :(得分:1)
您可以使用waveform
来获取具有相同日期的合并对象。在array#reduce
内,合并具有相同日期的对象,然后使用array#reduce
获取所有值。
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;
答案 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是一个庞大的框架,拥有大型库,但只有在开始使用正确的语法之前才需要它。
此示例在控制器中无需编码即可工作:
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;