Ramda 非常适合这类问题。
在数据量小的地方,我们可以使用简单的reduce函数,以及indexOfhelper。
// match id of object to required index and insert
var sortInsert = function (acc, cur) {
var toIdx = R.indexOf(cur.id, a);
acc[toIdx] = cur;
return acc;
};
// point-free sort function created
var sort = R.reduce(sortInsert, []);
// execute it now, or later as required
sort(b);
// [ { id: 2 }, { id: 3 }, { id: 1 }, { id: 4 } ]
这适用于小型(ish)数据集,但每次通过归约迭代的indexOf 操作对于大型数据集效率低下。
我们可以通过从另一边解决问题来解决这个问题,让我们使用groupBy 按对象的 id 对我们的对象进行分组,从而创建字典查找(好多了!)。然后我们可以简单地map 覆盖所需的索引并将它们转换为该位置对应的对象。
这是使用这种方法的解决方案:
var groupById = R.groupBy(R.prop('id'), b);
var sort = R.map(function (id) {
return groupById[id][0];
});
sort(a);
// [ { id: 2 }, { id: 3 }, { id: 1 }, { id: 4 } ]
最后,这又是一个解决方案,非常简洁:
R.sortBy(R.pipe(R.prop('id'), R.indexOf(R.__, a)))(b);
// [ { id: 2 }, { id: 3 }, { id: 1 }, { id: 4 } ]
我喜欢使用Ramda 组合具有行为的函数并将算法与其作用的数据分开的方式。您最终会得到非常易读且易于维护的代码。