Array.sort函数仅适用于单个条件



我试图根据值进行组织,然后如果它们具有相同的值,则按字母顺序进行组织。

function order(a, b, total) {
if (total == 0) {
return a.localeCompare(b)
} else {
return total;
}
}
var thingsArr = {"lamp":2, "books":2};
Object.keys(thingsArr).sort(function (a, b) {
order(a, b, thingsArr[b] - thingsArr[a])
});

else(函数顺序内(不应该按字母顺序组织结果数组,if不应该按最高值组织吗?只有当我单独使用它们时,它才会起作用
我做错了什么?

您需要在排序函数中返回一个值!

function order(a, b, total) {
if (total == 0) {
return a.localeCompare(b);
} else {
return total;
}
}
var thingsArr = {"lamp":2, "books":2};
const result = Object.keys(thingsArr).sort(function (a, b) {
return order(a, b, thingsArr[b] - thingsArr[a]);
});
console.log(result);

如果目标是获得一个有序的名称列表,那么您可以通过将总计算移动到您的订单函数来提高可读性,例如:

const things = {"lamp":2, "books":2}; // not an array (thingsArr?)
function orderThings(a, b) {
const total = things[b] - things[a];
if (total === 0) {
return a.localeCompare(b)
}
return total;
}
Object.keys(things).sort(orderThings);

但是,如果你计划使用列表作为键来引用你的项目,那么可能值得考虑映射到对象数组{名称:"灯",数量:2}或元组["灯",2],你可以这样做

const things = {"cupboard": 0, "lamp": 2, "books": 2};
function mapValuesToObj([name, qty]) {
return {
name,
qty,
};
}
function orderThings(a, b) {
const total = b.qty - a.qty;
if (total === 0) {
return a.name.localeCompare(b.name)
}
return total;
}
Object.entries(things).map(mapValuesToObj).sort(orderThings);

退货:

[
{ name: 'books', qty: 2 },
{ name: 'lamp', qty: 2 },
{ name: 'cupboard', qty: 0 }
]

希望这有帮助:(坚持下去,你做得很好!

数组排序函数需要返回值。您需要根据参数和顺序结果返回负、零或正的int值。

欲了解更多信息,请参考此网址。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

最新更新