对属性上的对象数组进行排序,但首先保留缺少属性的对象



下面是一个示例

testWidgetOrderSort = [
{ "_id": "name", "order": 1 },
{ "_id": "is", "order": 2 },
{ "_id": "my", "order": 0 },
{ "_id": "oh I would be very first" },
{ "_id": "adam", "order": 3 }
]

这里的对象{"_id":"哦,我会是第一个"}没有属性顺序,所以它应该是第一个。然后应该根据属性"对其余对象进行排序;订单;所以在排序之后应该是

output= [ { _id: 'oh I would be very first' },
{ _id: 'my', order: 0 },
{ _id: 'name', order: 1 },
{ _id: 'is', order: 2 },
{ _id: 'adam', order: 3 } ]
逻辑是基本的数组排序逻辑。
  • 如果同时定义了a.orderb.order,则根据最大值返回1或-1
  • 如果其中任何一个未定义,则根据定义的值返回1或-1
  • 请注意:值1-1决定了两个节点之间的相对位置。返回1a置于b之后,并且-1a置于b之前

const testWidgetOrderSort = [
{ "_id": "name", "order": 1 },
{ "_id": "is", "order": 2 },
{ "_id": "my", "order": 0 },
{ "_id": "oh I would be very first" },
{ "_id": "adam", "order": 3 }
];
const output = testWidgetOrderSort.sort((a, b) => {
if( a.order !== undefined && b.order !== undefined ) {
return a.order > b.order ? 1 : -1;
} else {
return a.order !== undefined ? 1 : -1
}
});
console.log(output);

我想出了这样的东西:

const test = [
{ "_id": "name", "order": 1 },
{ "_id": "is", "order": 2 },
{ "_id": "my", "order": 0 },
{ "_id": "oh I would be very first" },
{ "_id": "adam", "order": 3 }
];
const x = test.sort((a, b) => {
const [STAY, SWAP] = [-1, 1];
if (!a.hasOwnProperty('order')) { return STAY; }
if (!b.hasOwnProperty('order')) { return SWAP; }
return a.order - b.order;
});
console.log(x);

您只需要传递自定义比较器函数

if (!("order" in a)) return -1;
if (!("order" in b)) return 1;
else return a.order - b.order;

1)如果属性ordera中不存在,则返回-1

2)如果属性orderb中不存在,则返回1

3)如果两个对象都具有order属性,则只按升序排序。

const arr = [
{ _id: "name", order: 1 },
{ _id: "is", order: 2 },
{ _id: "my", order: 0 },
{ _id: "oh I would be very first" },
{ _id: "adam", order: 3 },
];
const result = arr.sort((a, b) => {
if (!("order" in a)) return -1;
if (!("order" in b)) return 1;
else return a.order - b.order;
});
console.log(result);

如果你不太关心性能,下面的应该没问题,

const testWidgetOrderSort = [
{ "_id": "name", "order": 1 },
{ "_id": "is", "order": 2 },
{ "_id": "my", "order": 0 },
{ "_id": "oh I would be very first" },
{ "_id": "adam", "order": 3 }
];
const finalArr = testWidgetOrderSort.filter(a => typeof a.order === "undefined");
const sortedArrWithOrderItems = testWidgetOrderSort.filter(a => typeof a.order !== "undefined").sort((a,b) => (a.order > b.order ? 1 : -1));
finalArr.push(...sortedArrWithOrderItems);
console.log(finalArr);

注意:就我个人而言,我建议使用@Nithiesh或@decpk解决方案,它更干净,性能更好。我的解决方案只是为问题提供另一个解决方案

最新更新