[英]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);
您可以使用array.prototype.sort
和array.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.