如何实现基于两个数组创建结果数组的逻辑?

时间:2016-04-28 22:24:12

标签: javascript jquery

我有三个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。实现这个的优雅方式是什么?

3 个答案:

答案 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;
&#13;
&#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}) 
    }
}
}