如何解决按值对JavaScript对象进行排序,如果多个键具有相同的值,则按键字母顺序排序按顺序返回排序的键
优先级按最高值排序,如果两个或多个键具有相同的值,则应按字母顺序对键进行排序。
尝试以下逻辑,为我工作。寻找更好的方法。**
//Input Object:
let myObj = {
hello : 1,// key is Alpha,value is Number
zello : 5,pillow : 6,there : 6,here : 6,peppa : 2,boww : 5
};
let flag = true,initialCount=0,finalCount=0,newArr = [];
const keysSorted = Object.keys(myObj).sort((a,b) => myObj[b]-myObj[a]);
for(let i=0; i<keysSorted.length; i++) {
if(myObj[keysSorted[i]] === myObj[keysSorted[i+1]]) {
if(flag) {
initialCount = i;
flag = false;
}
} else {
if(!flag) {
finalCount = i;
}
if(flag) {
newArr.push(keysSorted[i]);
} else {
let tempArr = keysSorted.slice(initialCount,finalCount+1);
tempArr.sort();
newArr.splice(initialCount,...tempArr);
}
flag = true;
initialCount = 0;
finalCount = 0;
}
}
console.log(newArr);
//Output:
//["here","pillow","there","boww","zello","peppa","hello"]
解决方法
以下功能将简化您当前的方法。
function sortObj(obj) {
return Object.entries(obj)
.sort((a,b) =>
a[1] !== b[1] ?
b[1] - a[1] :
b[0] < a[0] ? 1 : -1
)
.map(e => e[0]);
}
工作演示
function sortObj(obj) {
return Object.entries(obj)
.sort((a,b) =>
a[1] !== b[1] ?
b[1] - a[1] :
b[0] < a[0] ? 1 : -1
)
.map(e => e[0]);
}
let myObj = {
hello : 1,// key is Alpha,value is Number
zello : 5,pillow : 6,there : 6,here : 6,peppa : 2,boww : 5
};
console.log(sortObj(myObj));
,
有一个相当新的(es2017)功能Object.entries()
可以提供帮助。它将对象作为数组返回,并使其易于处理。
// returns [["hello",1],["zello",5],["pillow",6],["there",["here",["peppa",2],["boww",5]]
console.log(Object.entries(myObj));
使用Object.entries()
,我们可以按索引访问名称和值:
function sortByPriorityDescAndNameAsc(i,j) {
let priority = (i[1] - j[1]) * -1;
let name = i[0].localeCompare(j[0]);
// uses sort by name if priority is zero
return priority || name;
}
// returns ["here","pillow","there","boww","zello","peppa","hello"]
Object.entries(myObj).sort(sortByPriorityDescAndName).map(i => i[0]);
我们可以进一步缩短代码,但是为了清楚起见,我们保留了它。
,按两个条件排序的方式是,如果第一个排序值不同,则返回一个负值或正值。如果它们相同相同,则可以使用 second 值进行排序来代替该逻辑。如果那些相同,则返回0。
let myObj = {
hello : 1,boww : 5
};
const entries = Object
.entries(myObj)
.sort(([keyA,valueA],[keyB,valueB]) => {
return (valueA === valueB)
? keyA.localeCompare(keyB); // Return value is compatible with sort functions
: valueB - valueA; // If B > A,then result is positive meaning A goes second
})
.map(([key,value]) => key); // Get just the keys
console.log(entries);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。