【问题标题】:Javascript Arbitrary sort array based on values of a field基于字段值的Javascript任意排序数组
【发布时间】:2016-08-26 20:52:21
【问题描述】:

所以我有一个如下所示的对象数组:

var myArray = [{priority : "low"}, {priority: "critical"}, {priority: "high"}]

我需要以这种方式排序:1) 临界、2) 高和 3) 低。

如何做到这一点?

【问题讨论】:

  • 在开始时,请阅读 MDN 上的 Array.sort

标签: javascript arrays ecmascript-6


【解决方案1】:

我建议使用一个对象来存储排序顺序。

如果你需要一个默认的排序值,你可以使用一个未知优先级排序的值来开始或结束。

var sort = ['critical', 'high', 'low'],
    defaultValue = Infinity,
    sortObj = {},
    myArray = [{ priority: "unknown" }, { priority: "low" }, { priority: "critical" }, { priority: "high" }];

sort.forEach(function (a, i) { sortObj[a] = i + 1; });

myArray.sort(function (a, b) {
    return (sortObj[a.priority] || defaultValue) - (sortObj[b.priority] || defaultValue);
});
	
console.log(myArray);

【讨论】:

  • 这应该从一开始就被接受了,谢谢
  • 过早的优化....(a, b) => sort.indexOf(a.priority) - sort.indexOf(b.priority) 会简单得多。
  • @georg,我不是indexOf的粉丝。
【解决方案2】:

使用将优先级名称映射到数字的对象,然后根据它进行排序。

var priorities = {
  low: 0,
  high: 1,
  critical: 2
};

var myArray = [{
  priority: "low"
}, {
  priority: "critical"
}, {
  priority: "high"
}]

myArray.sort(function(a, b) {
  return priorities[b.priority] - priorities[a.priority];
});

console.log(myArray);

【讨论】:

  • 不是任意排序。
  • 对象中的优先级名称和值之间的关联是任意的。
猜你喜欢
  • 1970-01-01
  • 2013-05-17
  • 2021-12-14
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多