按下一个 id Ramda.js 排序双向链表
Sort doubly linked list by next id Ramda.js
我想按 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
原生方法
您可以按 id
排序并选择最低的 id
作为所需输出的第一个元素,然后您可以通过使用属性 [=13 查找下一个节点来推送下一个元素=].
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);
通过id
创建项目索引,找到第一个项目(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>
我想按 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
原生方法
您可以按 id
排序并选择最低的 id
作为所需输出的第一个元素,然后您可以通过使用属性 [=13 查找下一个节点来推送下一个元素=].
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);
通过id
创建项目索引,找到第一个项目(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>