【问题标题】:Sort Array of objects by property value typescript按属性值打字稿对对象数组进行排序
【发布时间】:2020-04-22 19:52:03
【问题描述】:

I am attaching output how i need我有如下对象列表,

const list = [{
  "ID": "3",
  "Status": "NEW"
},
{
  "ID": "1",
  "Status": "Open",
},
{
  "ID": "9",
  "Status": "NEW",
},
{
  "ID": "5",
  "Status": "NEW",
},
{
  "ID": "0",
  "Status": "Closed",
},
{
  "ID": "6",
  "Status": "Closed",
}];

我想按状态排序.. 根据下拉选择。下拉数组包含 [New, Closed, Open]。如果我选择“新建”,则“新建”状态应该位于列表顶部,“打开”也是如此。

我尝试了列表排序,如下所示,它给出的升序和降序不是我想要的。

list.sort(
  function(a, b) {
    return a.Status < b.Status ? -1 : a.Status > b.Status ? 1 : 0;
});

请建议,如何传递属性值。 提前谢谢你。

【问题讨论】:

  • 你希望输出如何?
  • 如果New状态排在首位,那么其他2个状态呢?
  • 您要排序还是排序?
  • Vandesh,我很抱歉我很困惑.. 在这种情况下我该如何做 orderby
  • 达米安,剩余状态将在该列表下方。

标签: javascript angular typescript


【解决方案1】:

您可能正在寻找

const order = ["NEW", "Closed", "Open"];
list.sort(function(a, b) {
    return order.indexOf(a.Status) - order.indexOf(b.Status);
});

(这仅在所有.Status 值都出现在order 数组中的假设下有效)

【讨论】:

  • 嗨,Bergi,我可以使用 switch case 吗?代替索引? sortListBy('新'); sortListBy(statusValue) { switch (statusValue) { case 'New': { list.sort( function(a, b) { return a.status - b.status; });休息; }, case 'Open': { list.sort( function(a, b) { return a.status - b.status; });休息; } } }
  • @PraveenBomminani 不,您不能使用indexOf 调用更改sort 回调。当然,您可以使用任何您想要的逻辑来动态选择order
  • 知道了,谢谢Bergi。
【解决方案2】:

也许您可以使用过滤器来显示所有包含 NEW 或 Open 的列表值

const list = [{
  "ID": "3",
  "Status": "NEW"
},
{
  "ID": "1",
  "Status": "Open",
},
{
  "ID": "9",
  "Status": "NEW",
},
{
  "ID": "5",
  "Status": "NEW",
},
{
  "ID": "0",
  "Status": "Closed",
},
{
  "ID": "6",
  "Status": "Closed",
}];

const ans = list.filter(e => e.Status === 'NEW');
console.log(ans);

【讨论】:

  • 您好感谢您的回答,我想要列表中的所有对象,但具有选定的值。如果我通过“新”,新的状态值应该在顶部,剩余的将在新对象之后。
  • 也许 bergi 的解决方案适合您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
相关资源
最近更新 更多