如何对首尾关联的二元对象数组进行排序?
按首尾匹配规则排序二元元素数组
首先注意:你给出的原始数组存在JavaScript语法错误,对象需要明确的键值对结构(比如{start: 'a', end: 'b'}),或者直接使用二元数组['a','b'],下面的方案基于这两种修正后的结构展开。
常规的sort方法是基于两两元素的比较逻辑排序,而你的需求是构建首尾衔接的链式序列,前一个元素的尾值等于后一个的首值,这种场景下sort和localeCompare并不适用,需要通过构建映射表的方式来生成目标序列:
实现步骤
- 构建一个映射表,将每个元素的起始值关联到元素本身,用于快速查找下一个衔接的元素;
- 确定序列的起点:找到那个没有任何元素的尾值与其起始值匹配的元素(也就是整个链的开端);
- 从起点开始,依次通过映射表找到下一个元素,直到完成整个序列的构建。
代码实现(对象结构版本)
// 修正后的原始数组 const arr = [ { start: 'a', end: 'b' }, { start: 'd', end: 'e' }, { start: 'b', end: 'c' }, { start: 'c', end: 'd' } ]; // 1. 构建起始值到元素的映射 const startMap = new Map(); arr.forEach(item => startMap.set(item.start, item)); // 2. 找到序列起点:起始值不在所有尾值集合中的元素 const endValues = new Set(arr.map(item => item.end)); let currentItem = arr.find(item => !endValues.has(item.start)); // 3. 构建排序后的序列 const sortedArr = []; while (currentItem) { sortedArr.push(currentItem); currentItem = startMap.get(currentItem.end); } console.log(sortedArr); // 输出:[{start: 'a', end: 'b'}, {start: 'b', end: 'c'}, {start: 'c', end: 'd'}, {start: 'd', end: 'e'}]
代码实现(二元数组版本)
如果你的元素是二元数组结构,代码可以调整为:
// 修正后的原始数组 const arr = [['a','b'], ['d','e'], ['b','c'], ['c','d']]; const startMap = new Map(); arr.forEach(item => startMap.set(item[0], item)); const endValues = new Set(arr.map(item => item[1])); let currentItem = arr.find(item => !endValues.has(item[0])); const sortedArr = []; while (currentItem) { sortedArr.push(currentItem); currentItem = startMap.get(currentItem[1]); } console.log(sortedArr); // 输出:[['a','b'], ['b','c'], ['c','d'], ['d','e']]
补充说明
如果你的数组存在多个不连通的链或者循环链(比如a→b→a),需要额外添加逻辑处理分支,但针对你给出的单链场景,上述代码可以直接得到预期结果。
内容的提问来源于stack exchange,提问作者Veysel Alceylan
相关产品推荐
相关产品推荐

