如何在JavaScript中套用嵌套排序

我在javascript中有以下对象数组

[
{'name' : 'Ram','age': 10,'city' : 'a'},{'name' : 'Shyam','age': 5,{'name' : 'Aditya','city' : 'b'},'city' : 'a'}]

现在,我需要应用嵌套排序.

用户可以按名称,年龄,城市对上述集合进行排序.

假设用户要求按名称排序,则排序后的数组将看起来相似.

[
{'name' : 'Aditya','city' : 'b'}
{'name' : 'Mohan','age': 50,'city' : 'b'}
{'name' : 'Ram',用户单击以按年龄(asc)进行排序,但这不会打扰上面的数组.

它看起来应该像

[
{'name' : 'Aditya','city' : 'a'}]

但是如果假设用户要求按年龄对上述排序说明进行排序,那么它应该看起来像

 [
{'name' : 'Aditya','city' : 'a'}

这就是我当前要排序的函数的样子.

let compareObjects = (key,order = 'asc') => {
return function (a,b) {
    if (!a.hasOwnProperty(key) || !b.hasOwnProperty(key)) {
        // property doesn't exist on either object
        return 0;
    }

    const varA = (typeof a[key] === 'string') ?
        a[key].toUpperCase() : a[key];
    const varB = (typeof b[key] === 'string') ?
        b[key].toUpperCase() : b[key];

    let comparison = 0;
    if (varA > varB) {
        comparison = 1;
    } else if (varA < varB) {
        comparison = -1;
    }
    return (
        (order == 'desc') ? (comparison * -1) : comparison
    );
}}


 arrOfObjects.sort(compareObjects('age'));

但是我不知道如何应用嵌套排序?

谢谢!

最佳答案
compareObjects方法可以接受{key:order}对象数组(sortBy).然后用for … of循环sortBy数组,提取键和顺序,并比较直到结果不为0,或者如果它们都相等则返回0.

const compareStr = (a,b) => a.toLowerCase().localeCompare(b.toLowerCase())
const compareNumber = (a,b) => a - b

const compareBy = new Map([
  ['name',compareStr],['age',compareNumber],['city',])

const compareObjects = sortBy => (a,b) => {
  for (const srt of sortBy) { // iterate sortBy
    const [key,order] = Object.entries(srt)[0]; // extract key|order pairs
    const sorter = compareBy.get(key) // get the sorter from the Map

    if (!sorter || !(key in a) || !(key in b)) continue // if no sorter or if key doesn't exist in either object continue to the next sorter

    const score = sorter(a[key],b[key]) // sort the current values

    if (score === 0) continue; // if score is 0 continue to next sorter

    return score * (order === 'asc' ? 1 : -1) // return the score multiplied by -1 for non asc values
  }

  return 0;
}

const data = [{"name":"Ram","age":10,"city":"a"},{"name":"Shyam","age":5,{"name":"Aditya","city":"b"},"city":"a"}]

const result = data.sort(compareObjects([
  { age: 'desc' },{ name: 'asc' }
]))

console.log(result)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: 首先在编辑器里面插入javascript代码: 确定后会在编辑器插入这样的代码: <pre
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代码高亮,因为SyntaxHighlighter的应用非常广泛,所以将kindeditor默认的prettify替换为SyntaxHighlighter代码高亮插件 上一篇“让kindeditor显示高亮代码”中已经
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)
原生JS实现别踩白块小游戏(一)