2013-07-24 52 views
0

我有兩個用戶之間的消息數組,如私人聊天。用戶A可以與用戶B,C和D進行2-3次聊天。拆分數組並創建一個多維數組

現在我必須拆分這個數組並獲得長度爲3的數組(A-B,A-C,A-D之間的消息)。要做到這一點,我用這個代碼:

var gloabal = []; 
var myArray = [];  
function splitArray() { 

    alert("Split"); 

    var oldArray = myArray; 
    var newArray = []; 

    var object = oldArray[0]; 
    var daUtente = object.get("daUtente"); 
    var aUtente = object.get("aUtente");    

    for (var i = 0; i < myArray.length; i++) { 

     var obj = myArray[i]; 
     var newDaUtente = obj.get("daUtente"); 
     var newaUtente = obj.get("aUtente"); 

     if ((newDaUtente == daUtente) && (newaUtente == aUtente) || 
      (newDaUtente == aUtente) && (newaUtente == daUtente)) { 
       newArray.push(obj); 
       oldArray.splice(i, 1); 
     } 

     var lastObj = myArray[myArray.length - 1]; 

     if (obj == lastObj){ 
      gloabal.push(newArray); 
      newArray = []; 

      if(oldArray.length != 0) { 
       myArray = oldArray; 
       splitArray(); 
      } 
      else { 
       myArray = gloabal; 
       alert("end");  
      } 
     }  
    } 
} 

這種邏輯可與iPhone應用程序,但使用Javascript我有一些問題。我認爲原因是我對Javascript的不瞭解。你能幫我解決這個錯誤嗎?我認爲問題是:

else { 
    myArray = gloabal; 
    alert("end");  
} 

,因爲我沒有看到「結束」警惕!

實施例: 數組:

1 - user A - user B - message 
2 - user B - user A - message 
3 - user A - user B - message 
4 - user A - user B - message 
5 - user A - user C - message 
6 - user C - user A - message 
7 - user A - user D - message 

我想這樣的: 陣列1

1 - user A - user B - message 
2 - user B - user A - message 
3 - user A - user B - message 
4 - user A - user B - message 

陣列2

1 - user A - user C - message 
2 - user C - user A - message 

陣列3

1 - user A - user D - message 

newArray = [陣列1,陣列2,陣列3]

+0

請向我們展示一些示例輸入和預期輸出。目前還不清楚這個功能應該做什麼。 – Bergi

+0

我用一個例子編輯我的問題! – kikko088

+0

我仍然不確定這些數組包含的是什麼。你可以讓它成爲一個可執行的*例子嗎?嘗試記錄'JSON.stringify(myArray,null,4)'的值,您可以將其作爲數組文字發佈。順便說一句,你的函數的結果是什麼,它不返回任何東西? – Bergi

回答

0

我有一個很難理解你的代碼,但這裏是我怎麼想制定這樣的事情。

首先,我有一個名爲getId簡單的函數:

function getId(to, from) {                                          
    // we use sort so that we get a consistent id; results in alphabetic sorting                            
    return [to, from].sort().join("-");                                      
} 

這個函數構造的標識符這是每次談話配對假設你的用戶名是唯一的獨一無二的。此外,A->BB->A這兩個值的編號相同,因爲它按字母順序排列了tofrom值。

該函數用於使用消息值填充Object。這是我實現的splitArray

function splitArray() { 
    var intermediary = {}; 
    for(var i = 0; i < data.length; ++i) { 
     var id = getId(data[i].to, data[i].from); 
     if(intermediary.hasOwnProperty(id)) { 
      intermediary[id].push(data[i]); 
     } else { 
      intermediary[id] = [data[i]]; 
     } 
    } 
    // xform from object to array 
    result = []; 
    var keys = Object.keys(intermediary); 
    for(i = 0; i < keys.length; ++i) { 
     result.push(intermediary[keys[i]]); 
    } 
} 

我有我的數據佈局是這樣的:

var data = [                                             
    {'to': "B", 'from': "A", 'msg': "message"},                                    
    {'to': "A", 'from': "B", 'msg': "message"},                                    
    {'to': "B", 'from': "A", 'msg': "message"},                                    
    {'to': "B", 'from': "A", 'msg': "message"},                                    
    {'to': "C", 'from': "A", 'msg': "message"},                                    
    {'to': "A", 'from': "C", 'msg': "message"},                                    
    {'to': "D", 'from': "A", 'msg': "message"}                                     
]; 

提供的字段tofrom存在,該功能將工作(和這些領域可以很容易地改名爲splitArray)。

該函數通過構造用戶對到消息的映射,然後將其平化爲2D數組。使用中間值Object是因爲即使展平會在函數結尾創建一個小的處理開銷,但它比反覆搜索用戶對以便將它們輸入適當的數組要快。下面是結果的結構,我從這個得到:

[ 
    [ 
     {"to":"B","from":"A","msg":"message"}, 
     {"to":"A","from":"B","msg":"message"}, 
     {"to":"B","from":"A","msg":"message"}, 
     {"to":"B","from":"A","msg":"message"} 
    ], 
    [ 
     {"to":"C","from":"A","msg":"message"}, 
     {"to":"A","from":"C","msg":"message"} 
    ], 
    [ 
     {"to":"D","from":"A","msg":"message"} 
    ] 
] 

希望它能幫助:)

編輯:我使用的全局變量,因爲這是你使用的是什麼,但是我會強烈建議使用參數函數返回如下值:

function splitArray(messages) { 
    ..... 
    return results; 
} 

全局變量和函數很容易編寫,但很難維護。