微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

按值对JavaScript对象进行排序,如果多个键具有相同的值,则按键字母顺序排序按顺序返回排序的键

如何解决按值对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 举报,一经查实,本站将立刻删除。