如何按特定顺序对数组中的三个项目进行排序?

时间:2019-12-20 13:40:20

标签: javascript arrays reactjs sorting

此问题是this one

的扩展

我创建了一个购物车,可以在其中添加或删除物品。在我的应用中的某个时候,我正在显示此购物车,最多可容纳3件商品。但是,随着我从购物车中添加/删除商品的顺序发生了变化。

{cartItems.map( item => <p>{item.name || item.time}</p>)}

要添加的项目具有type属性,可用于设置订单

[{
  "id": "0",
  "type": "service",
  "name": "Painting",
}, {
  "id": "0",
  "type": "time",
  "day": "today",
  "time": "09:40",
}, {
  "id": "0",
  "type": "business",
  "name": "Baron's Motel",
}]

到目前为止,一个善良的陌生人教我如何使用sort()来解决两个问题

function compare(a, b) {
  if (a.type === b.type) return 0;
  else if (a.type === 'time') return -1;
  return 1;
}

我该如何进一步提高这一层次并分类3个项目,始终在“服务”之前显示“时间”类型的对象,并在最后放置“业务”?

2 个答案:

答案 0 :(得分:2)

您可以使用对象或其他某种机制来存储项目类型的 weights

function compare(a, b) {
   const weights = { time: 0, service: 1, business: 2 };
   return weights[a.type] - weights[b.type];
}

答案 1 :(得分:1)

您可以按所需的特定顺序排列类型的数组。并使用该数组中当前类型索引的差值。

const arr = [{
    "id": "0",
    "type": "service",
    "name": "Painting",
},
{
    "id": "0",
    "type": "time",
    "day": "today",
    "time": "09:40",
},
{
    "id": "0",
    "type": "business",
    "name": "Baron's Motel",
}]
let order = ['time', 'service', 'business'];
const res = arr.sort((a, b) => order.indexOf(a.type) - order.indexOf(b.type));

console.log(res)