Javascript 拆分数组并创建多维数组
我在两个用户之间有一系列消息,比如私人聊天。用户A可以与用户B、C和D进行2-3次聊天 现在我必须拆分这个数组并获得一个长度为3的数组(A-B、A-C、A-D之间的消息)。为此,我使用以下代码: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
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;
}