编程语言
首页 > 编程语言> > javascript-根据另一个id数组对对象数组进行排序

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