繁体   English   中英

根据另一个对象数组的顺序对对象数组进行排序

[英]Sort array of objects based on order of another array of objects

我有两个对象数组,我需要将其中一个数组的顺序与另一个数组匹配。 这是一个例子:

const outOfOrderArray = [{field: 'foo'}, {field: 'bar'}, {field: 'bazz'}, {field: 'bizz'}];

const arrayInProperOrder = [{field: 'bizz'}, {field: 'bazz'}, {field: 'foo'}, {field: 'bar'}];

如何使outOfOrderArray匹配outOfOrderArray中对象的arrayInProperOrder

这是比@Faly解决方案少一个循环的方法。 无需对数组进行排序。 您可以循环遍历arrayInProperOrder并从outOfOrderArray找到匹配的元素,以便后者变得有序。

 const outOfOrderArray = [{field: 'foo'}, {field: 'bar'}, {field: 'bazz'}, {field: 'bizz'}]; const arrayInProperOrder = [{field: 'bizz'}, {field: 'bazz'}, {field: 'foo'}, {field: 'bar'}]; const newArray = []; arrayInProperOrder.forEach(item => { const original = outOfOrderArray.find(i => i.field === item.field); if (original) { newArray.push(original); } }); console.log(newArray); 

如果需要它,只需将newArray分配给outOfOrderArray

您可以创建一个临时对象来存储订单并将其用作sort()的基础

如果在临时对象上找不到某些字段,请使用Infinity作为默认值。

 const outOfOrderArray = [{field: 'foo'}, {field: 'bar'}, {field: 'bazz'}, {field: 'bizz'}]; const arrayInProperOrder = [{field: 'bizz'}, {field: 'bazz'}, {field: 'foo'}, {field: 'bar'}]; //Make a temp object - This will store the order of the field. This nessasary so that no need to search every reiteration on sort() const tempObj = arrayInProperOrder.reduce((c, v, i) => Object.assign(c, {[v.field]: i + 1}), {}); //Sort the array. outOfOrderArray.sort((a, b) => (tempObj[a.field] || Infinity) - (tempObj[b.field] || Infinity)); console.log(outOfOrderArray); 

Doc: sort()Infinity

您可以使用array.prototype.sortarray.prototype.findIndex

 const outOfOrderArray = [{field: 'foo'}, {field: 'bar'}, {field: 'bazz'}, {field: 'bizz'}]; const arrayInProperOrder = [{field: 'bizz'}, {field: 'bazz'}, {field: 'foo'}, {field: 'bar'}]; outOfOrderArray.sort( (a, b) => arrayInProperOrder.findIndex(e => e.field === a.field) - arrayInProperOrder.findIndex(e => e.field === b.field) ); console.log(outOfOrderArray); 

如果您关心性能,则可以构建一个对象,该对象允许您从arrayInProperOrder数组中按字段值获取索引:

 const outOfOrderArray = [{field: 'foo'}, {field: 'bar'}, {field: 'bazz'}, {field: 'bizz'}]; const arrayInProperOrder = [{field: 'bizz'}, {field: 'bazz'}, {field: 'foo'}, {field: 'bar'}]; const indexes = arrayInProperOrder.reduce((m, o, i) => (m[o.field] = i, m), {}); outOfOrderArray.sort( (a, b) => indexes[a.field] - indexes[b.field] ); console.log(outOfOrderArray); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM