我有三个JavaScript数组:
var arr1 = [
{id:32, "isNormal":true},
{id:4, "isNormal":false}},
{id:2, "isNormal":false},
{id:35, "isNormal":true},
{id:44, "isNormal":false}]
var arr2 = [
{id:32, "isNormal":false},
{id:4, "isNormal":false}},
{id:44, "isNormal":true},
{id:35, "isNormal":true},
{id:2, "isNormal":true}]
var arrResult = [
{externalId:32, startDate:currentDateTime, endDate:"null", "isNormal":false},
{externalId:4, startDate:"null", endDate:"null", "isNormal":false}},
{externalId:44, startDate:"null", endDate:"currentDateTime", "isNormal":true},
{externalId:35, startDate:"null", endDate:"null", "isNormal":true},
{externalId:2, startDate:"null", endDate:"currentDateTime", "isNormal":false}]
数组具有相同的ID。
我需要检查arr1中对象的isNormal属性,并在arr2中使用对象的相应属性(具有相同的id),
如果arr1.isNormal = true且arr2.isNormal = false,则写入arrResult.startDate当前日期和时间,
如果arr1.isNormal = false且arr2.isNormal = true,请写入arrResult.endDate当前日期和时间,
否则什么都不做。
这里的数组结果对应于arr1和arr2。实现这个的优雅方式是什么?
答案 0 :(得分:1)
要检查isNormals
是否不同,我建议使用XOR运算符^
。最好先对数组进行排序。
以下是几个例子,如何做到这一点。
//I've fixed your data, because it is incorrect
var arr1 = [
{id:32, startDate:"null", endDate:"null", "isNormal":true},
{id:4, startDate:"null", endDate:"null", "isNormal":false},
{id:2, startDate:"null", endDate:"null", "isNormal":false},
{id:35, startDate:"null", endDate:"null", "isNormal":true},
{id:44, startDate:"null", endDate:"null", "isNormal":false}]
var arr2 = [
{id:32, startDate:"null", endDate:"null", "isNormal":false},
{id:4, startDate:"null", endDate:"null", "isNormal":false},
{id:44, startDate:"null", endDate:"null", "isNormal":true},
{id:35, startDate:"null", endDate:"null", "isNormal":true},
{id:2, startDate:"null", endDate:"null", "isNormal":true}];
var sortFunction = function(a, b) {
return a.id - b.id;
}
arr1.sort(sortFunction);
arr2.sort(sortFunction);
//This way:
var result = arr2.map(function(v, i) {
var i1 = arr1[i].isNormal,
i2 = v.isNormal,
obj = {id:arr1[i].id, isNormal:v.isNormal};
obj.startDate = i1 ^ i2 && i1 ? 'currentDateTime' : 'null';
obj.endDate = i1 ^ i2 && i2 ? 'currentDateTime' : 'null';
return obj;
});
document.write('First: ', ['<pre>', JSON.stringify(result, 0, 1), '</pre>'].join(''));
//Or this way:
result = [];
for(var i = 0; i < arr1.length; i++) {
var i1 = arr1[i].isNormal,
i2 = arr2[i].isNormal,
obj = {id:arr1[i].id, startDate:"null", endDate:"null", isNormal:arr2[i].isNormal};
if(i1 ^ i2 && i1) {
obj.startDate = 'currentDateTime';
} else if(i1 ^ i2 && i2) {
obj.endDate = 'currentDateTime';
}
result.push(obj);
}
document.write('Second: ', ['<pre>', JSON.stringify(result, 0, 1), '</pre>'].join(''));
//Or this way:
var result = arr2.reduce(function(r, c, i) {
var i1 = arr1[i].isNormal,
i2 = c.isNormal,
obj = {id:arr1[i].id, startDate:"null", endDate:"null", isNormal:c.isNormal};
if(i1 ^ i2 && i1) obj.startDate = 'currentDateTime';
if(i1 ^ i2 && i2) obj.endDate = 'currentDateTime';
return r.push(obj), r;
}, []);
document.write('Third: ', ['<pre>', JSON.stringify(result, 0, 1), '</pre>'].join(''));
&#13;
答案 1 :(得分:1)
这里你去...有时最好保持代码简单......
var arrResult = [];
//loop through the two arrays
for (var i=0; i < arr1.length; i++) {
for (var j=0; j < arr2.length; j++) {
if (arr1[i].id == arr2[j].id) {
// if arr1.isNormal = true and arr2.isNormal = false write to arr2.startDate current date and time,
if (arr1[i].isNormal && arr2[j].isNormal == false) {
arrResult.push({externalId: arr1[i].id, startDate:new Date(), endDate:null, "isNormal":false})
}
//if arr1.isNormal = false and arr2.isNormal = true write to arr2.endDate current date and time,
if (arr1[i].isNormal == false && arr2[j].isNormal) {
arrResult.push({externalId: arr1[i].id, startDate:null, endDate:new Date(), "isNormal":true})
}
}
}
}
答案 2 :(得分:0)
忍受我,我对jQuery不是很好,但我做了这个JSFiddle。它可能会帮助你。 所以基本上比较两个ID,如果它们是相同的并且是正常的:如果它们是相同的并且是正常的,那么它是真的:假做B。
var res_arr = [];
for (var i=0; i < arr1.length; i++) {
for (var j=0; j < arr2.length; j++) {
if ( arr1[i].id == arr2[j].id && arr1[i].isNormal == arr2[j].isNormal == false) {
res_arr.push({id: arr1[i].id, startDate:'currentDateTime', endDate:"null", "isNormal":false})
}
else if ( arr1[i].id == arr2[j].id && arr1[i].isNormal == arr2[j].isNormal == true) {
res_arr.push({id: arr1[i].id, startDate:"null", endDate:'currentDateTime', "isNormal":true})
}
}
}