Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何根据“排序”对数组进行排序;“之前”;及;“之后”;JavaScript中的条件?_Javascript_Sorting - Fatal编程技术网

如何根据“排序”对数组进行排序;“之前”;及;“之后”;JavaScript中的条件?

如何根据“排序”对数组进行排序;“之前”;及;“之后”;JavaScript中的条件?,javascript,sorting,Javascript,Sorting,我想根据“before”和“after”条件对数组进行排序 例如: C应该在B之前:示例:{key:'C',条件:{$before:'B'} B应该在A之后:例如:{key:'B',条件:{$after:'A'} 答:示例{key:'A'} 得到的排序列表将是:A、C、B 我需要它,这样我就可以对管道中的中间件列表进行排序。每个中间件都有一个条件,我应该给出满足所有中间件所有条件的顺序。这类似于MS Project在甘特图中组织任务所做的,给定任务的要求 问题:最简单的方法是什么?即使使用外

我想根据“before”和“after”条件对数组进行排序

例如:

  • C
    应该在B之前
    :示例:
    {key:'C',条件:{$before:'B'}
  • B
    应该在A之后:例如:
    {key:'B',条件:{$after:'A'}
  • 答:示例
    {key:'A'}
得到的排序列表将是:
A、C、B

我需要它,这样我就可以对管道中的中间件列表进行排序。每个中间件都有一个条件,我应该给出满足所有中间件所有条件的顺序。这类似于
MS Project
在甘特图中组织任务所做的,给定任务的要求

问题:最简单的方法是什么?即使使用外部库,如
下划线
?好处:这种排序比“条件排序”有更好的名称吗?这对我的谷歌搜索很有帮助

编辑:输入应该是带有条件的项目数组。我无法硬编码排序方法

编辑2:如@Berdi所述。这称为类型排序。是的,根据项目和条件,可能没有满足所有条件的组合,我的算法应触发异常

编辑3:我想实现这一点的方式是计算所有可能的组合,然后寻找第一个满足所有条件的组合。这对我来说可能不会太慢,因为在我的情况下,我可以在应用程序启动时只执行一次,并且数组中的项目不会超过50个。但是无论如何,对于科学来说,最好知道一个更优化的解决方案

编辑4:我接受仅适用于after条件的解决方案。例如
MS Project

这可能有用

函数排序规则(规则,arr){
var rulesEvaluated=[];
rules.forEach(rule=>{
应用规则(规则,arr);
规则评估。推送(规则);
if(冲突(规则评估,arr)){
抛出新错误(“规则冲突”);
}
});
返回arr;
}
功能冲突(规则、arr){
返回规则.some(r=>r.condition.before?
arr.indexOf(r.key)>arr.indexOf(r.condition.before):

arr.indexOf(r.key)创建一个存储所需顺序的对象,然后像往常一样使用
[].sort()

var分拣机={
"A":1,,
“B”:3,
C:2
}
变量输入=['A','B','C'];
输入=输入.排序(函数排序(a,b){
返回分拣机[a]>分拣机[b];
});
控制台日志(输入);
document.write(“+input+”);
奖励:这种排序比“条件排序”有更好的名称吗


它被称为。根据您确切的输入格式和内容,它甚至可能没有很好的定义。

我会使用:一个哈希表,一个用于开始的指针,然后重新组合数组

(这个答案是我对这个问题回答的一部分:)

功能链(数组){
var o={},指针;
array.forEach(函数(a){
o[a.id]=a;
if(a.beforeId==null){
指针=a.id;
}
});
数组=[];
做{
push(o[pointer]);
pointer=o[pointer].afterId;
}while(指针!==null);
返回数组;
}
var unsorted=[{id:7,beforeId:6,afterId:8},{id:11,beforeId:10,afterId:null},{id:0,beforeId:null,afterId:1},{id:1,beforeId:0,afterId:2},{id:4,beforeId:3,afterId:5},{id:8,beforeId:7,afterId:9},{id:2,beforeId:1,afterId:3,beforeId:10,afterId:11},{id:3,beforeId:2,afterId:4},{id:5,beforeId:4,afterId:6},{id:6,beforeId:5,afterId:7}];

document.write(“”+JSON.stringify(chain(unsorted),0,4)+“”);
您只是想对数组进行正确排序吗?听起来像是
O(rules*items²)
这真的很慢Hanks@Bergi。我不知道。是的!根据我的项目和条件……排序方法应该会触发一个异常。@Andrepena:你能告诉我们你的“规则”的输入格式吗来吧?只有这样,我们才能设计出一个正确而完整的答案。我会接受一个只在
条件之后使用
$的答案。如果它太难得到的话both@andrerpena:
xy
的意思是
yx
,因此转换起来很简单。“创建一个存储所需顺序的对象”如果你只知道“之前”和“之后”,这实际上是最难的部分规则。如果规则来自您的老板/客户,除了手动构建此对象之外别无选择。如果规则来自数据库、可解析文件等,可能有一种方法可以通过编程生成它。这似乎很有希望。我现在得吃午饭了,但我会先检查您的解决方案!提前谢谢您。我感谢您的努力。我刚刚针对我的示例测试了您的解决方案……您的do/while在第一次迭代时退出,因此结果数组只有一项:hm,
var unsorted=[{id:'C',before:'B',after:null},{id:'B',before:null,after:A'},{id:'A',before:null,after:null}];
毫无意义,因为b有两个孩子,但解决方案适用于链,而不是树。我明白了。是的,我的问题更多的是关于树而不是链。谢谢!我感谢你的努力。我投票支持你接近:)