2016-04-28 36 views
0

我有這三個JavaScript數組結果數組:我需要幫助來實現邏輯來創建基於兩個arrayes

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。

我需要檢查ARR2與對象的相應屬性ARR1對象的isNormal財產(以相同的id),

如果arr1.isNormal =真,arr2.isNormal =假寫入arrResult.startDate當前日期和時間,

如果arr1.isNormal =虛假和arr2.isNormal =真寫arrResult.endDate當前日期和時間,

否則什麼也不做。

這裏對應ARR1和ARR2數組結果:

所以我的問題是什麼來實現這個優雅的方式?

+0

@Nishantjani我知道我可以使用if和switch statments implenent它。但我想創造更優雅的東西 – Michael

+0

我相信,排序兩個數組會降低運行時複雜度O(nlogn),而不是運行兩個嵌套for循環O(n^2)。這就是你所說的優雅的意思嗎? –

+1

發佈您當前使用的解決方案,我們將會看到是否可以改進。 – Nonemoticoner

回答

0

熊與我,即時通訊與jQuery不太好,但我沒有這JSFiddle。它可能會幫助你。 所以基本上比較兩個ID,如果他們是相同的,isnormal:真正做一個,如果他們是相同的,isnormal:假做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}) 
    } 
} 
} 
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(''));

+0

我在寫這個問題時犯了一些錯誤。我更新了我的問題,請參閱更新 – Michael

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}) 
      } 
     } 
    } 
} 
+0

我更新了我的問題。請參閱更新 – Michael

+0

我已經更新了我的答案。 –