Javascript 拆分数组并创建多维数组

Javascript 拆分数组并创建多维数组,javascript,arrays,split,Javascript,Arrays,Split,我在两个用户之间有一系列消息,比如私人聊天。用户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 obj

我在两个用户之间有一系列消息,比如私人聊天。用户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");       
            }   
        }       
    }
}
因为我没有看到“结束”警报

例如: 数组:

我想要这个: 数组1

阵列2

1 - user A - user C - message
2 - user C - user A - message
阵列3

1 - user A - user D - message

newArray=[array 1,array 2,array 3]

我很难理解您的代码,但下面是我如何构造这样一个东西的

首先,我有一个名为
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->A
都是相同的,因为它按字母顺序将
排序为
,并从
值排序

此函数用于用消息值填充
对象
。下面是我的
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]]);
    }
}
如果存在
的字段,该函数将起作用(这些字段可以在
拆分数组
中轻松重命名)

该函数的工作原理是构造用户对到消息的映射,然后将其展平为二维数组。之所以使用中间
对象
,是因为即使展平在函数结束时会产生很小的处理开销,但它比重复搜索用户对以将其输入适当的数组要快。以下是我从中得到的结果结构:

[
    [
        {"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;
}

全局变量和函数很容易编写,但很难维护

请向我们展示一些示例输入和预期输出。不清楚这个函数应该做什么。我用一个例子编辑我的问题!我仍然不确定这些数组到底包含什么。你能把它做成一个可执行的例子吗?尝试记录
JSON.stringify(myArray,null,4)
的值,您可以将其作为数组文本发布。顺便说一句,你的函数的结果是什么,它不会返回任何东西?
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":"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;
}