是否有更有效的方法根据Javascript中相同属性的多个值对数组进行排序?我有以下功能:
var p1 = [];
var p2 = [];
var p3 = [];
for (var i = 0; i < contentData.length; i++) {
if (contentData[i].priority === 1) {
p1.push(contentData[i]);
}
else if (contentData[i].priority === 2) {
p2.push(contentData[i]);
}
else if (contentData[i].priority === 3) {
p3.push(contentData[i]);
}
}
p1.sort(sortByDateDesc);
p2.sort(sortByDateDesc);
p3.sort(sortByDateDesc);
contentData = p1;
Array.prototype.push.apply(contentData, p2);
Array.prototype.push.apply(contentData, p3);
首先,我需要按其priority
属性对数组进行排序,然后按date
属性对其进行排序,该属性在函数sortByDateDesc
中完成。这可以以更有效的方式完成吗?
谢谢!
示例数组:
var data1 = {"title": "His face looks like the best chair", "text": "So there’s this really hot kid in my creative writing class. And everyone knows I like him." +
"But one day, he walked in looking like a freaking GQ model, and I accidentally out loud whispered “Shit, his face looks like the best chair” and the girl who sits " +
"in front of me turned around and said “WTH, that’s freaky and gross” and she moved her seat." +
"She gives me weird looks every time she sees me now.", "url": "http://www.catfacts.co", "user": "Kash Muni", "timestamp": Date.now(), "read":0, "priority":2};
sortByDateDesc函数:
function sortByDateDesc(a, b) {
if (a.timestamp > b.timestamp)
return -1;
if (b.timestamp > a.timestamp)
return 1;
return 0;
}
答案 0 :(得分:6)
您可以在自定义回调功能中使用||
。像这样:
contentData.sort( (a, b) => a.priority - b.priority || b.timestamp - a.timestamp );
只有当a.priority - b.priority
为零(它们相等)时,才会评估表达式的第二部分,这正是您希望日期发挥作用的时间。
如果日期顺序必须提升,则交换a.timestamp
和b.timestamp
。
答案 1 :(得分:1)
您使用sortByDate
函数走在正确的轨道上,该函数作为&#34; CompareFunction&#34;传递到.sort()
方法。
您提供的CompareFunction将传递两个参数,这些参数按惯例称为&#34; a&#34;和&#34; b&#34;,并且必须提供表示其相对位置的答案:
完全取决于CompareFunction如何处理这些对象。您可能只比较单个属性,比较多个属性,甚至在您的函数中执行复杂处理(但不要)。
对于本质上是数字的比较,您可以算术地确定答案。 E.g。
function sortNumbersInAscendingOrder(a, b) {
return a - b;
}
如果是&gt; b然后a - b得到一个肯定答案,表明&#39; a来自b&#39;。
比较字符串有点不同,因为比较运算符返回一个布尔值。但是,您实际上需要从您的CompareFunction提供所有三种答案变体 - 您可以支持您的某个对象并说它首先出现,即使它们是相同。这允许您使用三元运算符对字符串进行排序。 E.g。
function sortStringsAlphabeticalOrder(a, b) {
// Note: this is a case sensitive sort!
return (a <= b) ? -1 : 1;
}
与往常一样,Mozilla文档提供了出色的技术答案: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort