【发布时间】:2017-05-12 08:20:33
【问题描述】:
好的,我有一组 websocket 客户端连接。想象一下,这个数组包含到几台不同机器的连接。想象每个不同的字母(1、2、3 等)代表不同的主机。它可能看起来像这样:
const conns = [1,1,1,3,3,1,3,2,2,2,2,3,2,1,1,2,2];
我想做的是像这样对数组进行排序:
const conns = [1,2,3,1,2,3,1,2,3, ... etc];
原因是如果客户端没有响应,我不想重试到同一个主机,我想尝试向不同主机上的客户端发送消息,稍后再返回原始主机.这基本上就像一个循环类型的事情。
我认为像这样对数组进行排序的最佳方法是:
- 在数组中查找所有不同的主机(唯一字母)
- 遍历这个唯一的列表,然后从原始数组中拼接出项目。
这是我对上述算法的 JS 代码:
const list = [1,2,3,4,5,1,1,1,1,1,2,3,4,5,1,2,11,3,3,3,3,3,4,4,4,1,1,1];
const _ = require('lodash');
function findAndRemoveFirstMatch(m, list){
for(var i = 0; i < list.length; i++){
if(m === list[i]){
return list.splice(i,1)[0];
}
}
}
function getSorted(list){
const ret = [];
const set = _.uniqBy(list, function(x){
return x;
});
while(list.length > 0){
var i = 0;
while(i < set.length && list.length > 0){
var item;
if(item = findAndRemoveFirstMatch(set[i],list)){
ret.push(item);
}
i++;
}
}
return ret;
}
console.log(getSorted(list));
//给定上面的输入,我们得到:
[ 1, 2, 3, 4, 5, 11, 1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 3, 4, 1, 3, 4, 1, 3, 1, 3, 1, 1, 1 ]
我对这段代码并不感到自豪,我想知道是否有更好的方法来做到这一点。以上内容适用于此输入,但正在寻找一种清理它并使其更通用的好方法。
有没有更好/更快的方法来做到这一点?
【问题讨论】:
-
只需创建一个
Setobject 并将初始数组传递给构造函数。这将为您提供所有独特项目的可迭代列表。 -
@jfriend00 是的,但这是否适用于对象而不是原语?实际上,我使用的是对象而不是字符串。我想我可以将对象映射到原始 id,然后将其传递给 set 构造函数?谢谢你的好主意
-
是的,
Set适用于对象。这是它的一个真正优势,因为它不需要字符串作为键。 -
好吧,它的所有元素都将被添加,但不会有重复。给定的键只能在 Set 中出现一次。
-
它使用实际的对象引用本身。它不会比较对象是否包含相同的属性/值 - 只是它是否实际上是相同的对象引用。与
objA === objB的逻辑相同。
标签: arrays node.js algorithm sorting array-difference