0

プライベート チャットのように、2 人のユーザー間の一連のメッセージがあります。ユーザー A は、ユーザー B、C、および D と 2 ~ 3 のチャットを行うことができます。

次に、この配列を分割して、長さ 3 の配列 (AB、AC、AD 間のメッセージ) を取得する必要があります。これを行うには、次のコードを使用します。

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]

4

1 に答える 1

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("-");                                                                                                                                                       
}

この関数は、ユーザー名が一意であると仮定して、会話のペアごとに一意の識別子を作成します。さらに、この id は、との値をアルファベット順にソートするため、 と の両方A->Bで同じです。B->Atofrom

この関数は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"}                                                                                                                                                
];

フィールドtoとフィールドfromが存在する場合、関数は機能します (これらのフィールドは で簡単に名前を変更できます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;
}

グローバル変数と関数は、書くのは簡単ですが、維持するのは難しいです。

于 2013-07-25T00:59:37.317 に答える