【问题标题】:Sort doubly linked list by next id Ramda.js按下一个 id Ramda.js 对双向链表进行排序
【发布时间】:2020-02-19 10:02:32
【问题描述】:

我想按next_id 值对双向链表进行排序。

我的 DLL:

const dll = [
  {id: '22', prev_id: '41', next_id: '45'},
  {id: '45', prev_id: '22', next_id: null},
  {id: '41', prev_id: '14', next_id: '22'},
  {id: '14', prev_id: null, next_id: '41'},
]

结果:

const dll_result = [
  {id: '14', prev_id: null, next_id: '41'}, // next item - 41
  {id: '41', prev_id: '14', next_id: '22'}, // next item - 22
  {id: '22', prev_id: '41', next_id: '45'}, // next item - 45
  {id: '45', prev_id: '22', next_id: null},
]

我知道对 DLL 进行排序可能没有意义,但在我的情况下,我需要使用 next_id 顺序可视化数组中的数据。

P.S. 很高兴知道一个原生解决方案,然后我可以尝试自己转换为 Ramda.js

【问题讨论】:

    标签: javascript arrays sorting doubly-linked-list ramda.js


    【解决方案1】:

    通过id创建项目的am索引,找到第一项(prev_id === null),然后用while循环迭代,将当前对象压入结果数组:

    const findStart = R.find(R.propEq('prev_id', null))
    const indexById = R.indexBy(R.prop('id'))
    
    const sortByNextId = arr => {
      const index = indexById(arr)
      let current = findStart(arr)
      
      const sorted = []
      
      while(current) {
        sorted.push(current)
        current = index[current.next_id]
      }
      
      return sorted
    }
    
    const dll = [
      {id: '22', prev_id: '41', next_id: '45'},
      {id: '45', prev_id: '22', next_id: null},
      {id: '41', prev_id: '14', next_id: '22'},
      {id: '14', prev_id: null, next_id: '41'},
    ]
    
    const result = sortByNextId(dll)
    
    console.log(result)
    <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>

    【讨论】:

      【解决方案2】:

      原生方法

      您可以按id 排序并选择最低的id 作为所需输出的第一个元素,然后您可以通过使用属性next_id 查找下一个节点来推送下一个元素。

      const dll = [{id: '22', prev_id: '41', next_id: '45'},{id: '45', prev_id: '22', next_id: null},{id: '41', prev_id: '14', next_id: '22'},{id: '14', prev_id: null, next_id: '41'}],
            result = [[...dll].sort((a, b) => a.id - b.id).shift()];
      
      dll.forEach(() => result.push(dll.find(({id}) => id === result[result.length - 1].next_id)));
      console.log(result);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-07
        • 2016-06-19
        • 2011-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多