Javascript:如何按两个值对数组中的元素序列进行排序?

Javascript:如何按两个值对数组中的元素序列进行排序?,javascript,Javascript,我有未排序的数组 [ {val: 'one', vale: 'two'}, {val: 'three', vale: 'four'}, {val: 'two', vale: 'three'}, {val: 'six', vale: 'one'} ] 如何排序以获得这样的序列,如vale===next val [ {val: 'one', vale: 'two'}, {val: 'two', vale: 'three'}, {val: '

我有未排序的数组

[
    {val: 'one', vale: 'two'},
    {val: 'three', vale: 'four'},
    {val: 'two', vale: 'three'},
    {val: 'six', vale: 'one'}

]
如何排序以获得这样的序列,如vale===next val

[
    {val: 'one', vale: 'two'},
    {val: 'two', vale: 'three'},
    {val: 'three', vale: 'four'},
    {val: 'five', vale: 'six'},
    {val: 'six', vale: 'one'}
]
首先,通过查找来解析所有值:

input.forEach( obj => {
  obj.to = input.find( el => el.val === obj.vale );
  if(obj.to) obj.to.from = obj;
});
现在我们有了一个可以轻松解决的链条:

const result = [];
var current = input.find(obj => !obj.from) // the first in chain
do {
  result.push( current );
} while( current = current.to );

您可以循环数组,并通过比较外循环的
val
与内循环的
val
来使用嵌套循环,从外循环后的索引开始查找下一项

找到匹配项后,交换成员(除非它已经就位),并中断内部循环以继续使用外部循环

var数据=[
{val:'1',vale:'2'},
{val:'三',val:'四'},
{val:'两个',vale:'三个'},
{val:'六',val:'一'},
{val:'四',vale:'五'},
{val:'5',vale:'6'}
];
对于(变量i=0;i控制台日志(数据)您描述的操作不是排序操作。这是一个链表遍历。首先将数组转换为映射,然后使用链表遍历算法并进行调整。您将使用项目的第二个属性作为映射中的键,而不是节点的“下一个”属性

您需要显式指定起始节点,因为密钥空间没有排序

下面的算法使用访问键的附加映射,因为链接列表有一个循环

该算法按项目数线性扩展:

const N=10000;
常量输入=[];
对于(变量i=0;ilog(result.slice(N-10,N))元素的排序依据是什么?似乎您正在尝试按数值排序,但只显示字符串值。如果有“六”指向“一”,则任何算法都不能保证“一”将是第一个元素,除非它以某种方式理解“一”的语义。@Lix它只是exmaple,可以有任何必须等于以下属性的值,而不是带有数字的行val@Drop:如果可以是任何一对值,那么您如何知道列表中的第一对值?这对于表示数字的词来说是有意义的,但对于不表示起点的词来说就没什么意义了。如果没有明确的起点,那么应该很简单。@llama是的,我想,第一个对象永远是起点,它开始排序希望你意识到这个算法是O(N^2)不,你试图做其他学生的作业,但是failed@george你怎么了?1) 你为什么认为这是家庭作业?2) 那我为什么不帮忙呢?3) 为什么我失败了?3)可能你没有听关于算法复杂性的讲座。我认为算法复杂性的增加是一个失败,尤其是可以在没有任何努力的情况下实现更好的复杂性。你能告诉我你在循环中使用的find方法的算法复杂度是多少吗?因此,整个算法的复杂度是多少?当你的问题扩展到10000项时会发生什么?@george still:你有什么问题??1) 这是javascript。它永远不会跑那么快。2) 我为什么要在乎?它将运行顺利,为数1000项,我不认为有任何必要投资时间优化它。3) 你为什么不加上你自己的答案(如果你那么聪明的话),这与我的教育无关?是的,我试着通过reduce做类似的事情,但没有完全按照需要使用它,并且得到了前面的未定义值。我只是想知道,这个算法是否会比两个周期更快。我只是不使用HashMap是的,它会。散列映射是O(1),循环是O(N)。但我如何理解,如果in-objects有更多属性,当我们将数组转换为hashmapNo时,我们将丢失所有其他属性,结果数组中的所有原始对象都完好无损。引用将作为哈希映射值添加,此操作不会修改对象本身。