如何根据特定属性值在JavaScript中对对象数组进行排序?

3

我有一个通知对象数组,需要按照严重程度降序排序,即 Error > Warning > Information

例如:

var notificationArray = [ {
    code : "103",
    severity : "Error"
}, {
    code : "104",
    severity : "Information"
}, {
    code : "109",
    severity : "Error"
}, {
    code : "403",
    severity : "Warning"
}, {
    code : "510",
    severity : "Information"
}, {
    code : "114",
    severity : "Warning"
}, {
    code : "144",
    severity : "Error"
}, {
    code : "413",
    severity : "Warning"
} ];

怎样最简单地确保这个数组总是根据 severity 排序?

另外,关于排序对象数组的其他帖子大多是关于Unicode排序而不是根据固定值进行比较排序。如果我发布了重复的问题,请见谅。


“但是我没有找到一个讨论按属性值排序(而不是属性本身)的文章。” - 如果不是按照“值”来排序,你还会按照什么来排序呢? - CBroe
可能是重复的问题,参考按优先级排序属性 - baao
3个回答

14

您可以使用一个排序对象来指定严重性的优先级。

var notificationArray = [{ code: "103", severity: "Error" }, { code: "104", severity: "Information" }, { code: "109", severity: "Error" }, { code: "403", severity: "Warning" }, { code: "510", severity: "Information" }, { code: "114", severity: "Warning" }, { code: "144", severity: "Error" }, { code: "413", severity: "Warning" }, { code: "131", severity: "Error"}],
    order = { Error: 1, Warning: 2, Information: 3 };

notificationArray.sort(function (a, b) {
    return order[a.severity] - order[b.severity];
});

console.log(notificationArray);
.as-console-wrapper { max-height: 100% !important; top: 0; }


@Weedoze,更好,嗯。但为什么不呢? - Nina Scholz
我已经给你的其他(相同的)答案点了赞,这样我们就可以将其用作那些常见问题的重复目标... - baao
@Nina,我在原始集合上工作过,然后我在数组中引入了另一个 {code: "131", severity: "Error"},然后尝试再次排序。但是没有成功! - Lalit
@NinaScholz 这样做可以避免创建一个新对象,对吗? - Weedoze
1
@Weedoze,它使用相同的引用,应该是这样的。这没有任何区别,但有些是局部的,而另一些是全局的。 - Nina Scholz
显示剩余3条评论

0

这里有一个解决方案:

var errors = notificationArray.map(function(message) {
  return message.severity === 'Error';
});
var warnings = notificationArray.map(function(message) {
  return message.severity === 'Warning';
});
var infos = notificationArray.map(function(message) {
  return message.severity === 'Information';
});

var sortedMessage = errors.concat(warnings).concat(infos);

我不知道这个解决方案是否比 @NinaScholz 的更快,(也许对你来说更易懂)。


-1
对于每个严重程度,关联一个优先级。
示例:
var severity = {
    information: 0
    warning : 1,
    error : 2, 
}

然后根据每个严重性的优先级对数组进行排序。
notificationArray.sort(function(a, b) {
    var p1 = severity[a.severity.toLowerCase()];
    var p2 = severity[b.severity.toLowerCase()];
    return p2 - p1;
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接