javascript-根据另一个id数组对对象数组进行排序
作者:互联网
我有2个数组
a = [2,3,1,4]
b = [{id: 1}, {id: 2}, {id: 3}, {id: 4}]
我如何根据a对b进行排序?我想要的输出是
c = [{id: 2}, {id: 3}, {id: 1}, {id: 4}]
我更喜欢使用Ramda或常规JS.
解决方法:
Ramda对于这些类型的问题确实很有帮助.
在数据大小较小的地方,我们可以使用简单的reduce函数和indexOf帮助器.
// 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将算法与操作所依据的数据分开.您最终将获得可读性强且易于维护的代码.
标签:ramda-js,javascript 来源: https://codeday.me/bug/20191013/1909709.html