Javascript:使用两个可能的项对多个数组进行排序

Javascript:使用两个可能的项对多个数组进行排序,javascript,arrays,sorting,Javascript,Arrays,Sorting,我有一个包含一组数组的数组,其中每个数组都有相同的长度,只有两个可能的条目(+1和-1或+1和0)。现在我正在寻找一种对这些数组进行排序的有效方法,因此,如果我想检查列表是否包含给定数组,则无需将给定数组与列表中的每个数组进行比较 列表可能如下所示: list = [ [1, 1, -1, 1], [-1, 1, -1, 1], [1, -1, -1, 1] ]; 更准确地说,此列表是在while循环中创建的,其中的条件是在循环中创建的新数组尚未出现在列表中。因此,最好对数组进行动

我有一个包含一组数组的数组,其中每个数组都有相同的长度,只有两个可能的条目(+1和-1或+1和0)。现在我正在寻找一种对这些数组进行排序的有效方法,因此,如果我想检查列表是否包含给定数组,则无需将给定数组与列表中的每个数组进行比较

列表可能如下所示:

list = [
  [1, 1, -1, 1],
  [-1, 1, -1, 1],
  [1, -1, -1, 1]
];
更准确地说,此列表是在while循环中创建的,其中的条件是在循环中创建的新数组尚未出现在列表中。因此,最好对数组进行动态排序,例如将其插入列表中的适当位置

为了避免误解,循环现在看起来是这样的

var list = [];
var array = someArray;
while (indexOfArray(list, array) === -1) {
  list.push(array);
  array = calculateNewArray(array);
}
其中,indexOfArray是一个函数,如果存在,则返回列表中数组的索引,否则返回-1,calculateArray接受上一个数组并返回一个新数组。问题是列表可能会变得很长(数千或上万个不同的数组,其长度可能为几百个条目),因此始终将新数组与列表中保存的每个数组进行比较会非常耗时

什么是解决这个问题的有效和合理的方法

编辑:举个例子,上面的列表可以按

sortedList = sortList(list)
// sortedList should look like this
[
  [1, 1, -1, 1],
  [1, -1, -1, 1]
  [-1, 1, -1, 1],
]

首先是一行中包含尽可能多的+1的数组,其次是一行中包含最少+1的数组,依此类推,而最后一个数组中包含尽可能多的-1。

您只需映射
列表
并使用
排序()
对所有内部数组进行排序即可

列表=[
[1, 1, -1, 1],
[-1, 1, -1, 1],
[1, -1, -1, 1]
];
list=list.map(函数(x){返回x.sort(函数(a,b){返回a-b})});
控制台日志(列表)您可以使用并简单地添加内部数组的所有值

//要排序的数组
var list=[[1,1,-1,1]、-1,1,-1,1]、[1,-1,1];
//临时数组保存具有位置和排序值的对象
var mapped=list.map(函数(el,i){
返回{index:i,value:el.reduce(函数(a,b){returna+b;},0)};
});
//对包含缩减值的映射数组进行排序
映射.排序(函数(a,b){
返回b.value-a.value;
});
//用于生成订单的容器
var result=mapped.map(函数(el){
返回列表[el.index];
});

控制台日志(结果)这些需要是数组吗?您不能只存储字符串,如
00101
或数字(
parseInt(…,2)
)?请添加一些示例。因此,如果我理解正确,您可以生成3^n个具有非重分配值的数组。有一种更简单的方法可以实现这一点,而不需要排序、插入或搜索。@georg:这不是绝对必要的,但非常方便,因为我使用这些数组进行进一步的操作calculations@Yeldar:请您解释一下您的想法好吗?我的意思不是对数组的元素进行排序(它们需要按照特定的顺序),而是排序,例如,更改阵列的顺序themselves@Madao,请提供一些例子。否则它只是猜测你想要什么。@nicael,排序在原地,不需要地图。很好,谢谢!有没有比推送新数组并再次对整个列表排序更有效的方法来添加新数组?