对嵌套的 JSON 对象数组进行排序

时间:2021-04-17 06:43:29

标签: javascript sorting

我有一个对象数组,如下所示。我想根据键值递归排序

{
      "settingsList": [
        {
          "category1": [
            {
              "categoryName": "DRIVER",
              "description": "DRIVER",
              "sequence": 1
            },
            {
              "categoryName": "BALL",
              "description": "BALL",
              "sequence": 2
            },
            {
              "categoryName": "SAMPLE",
              "description": "SAMPLE",
              "sequence": 3
            },
            {
              "categoryName": "USER",
              "description": "USER",
              "sequence": 4
            }
          ]
        },
        {
          "category2": [
            {
              "paramName": "CPP",
              "description": "CPP",
              "sequence": 1
            },
            {
              "paramName": "PP",
              "description": "PP",
              "sequence": 2
            },
            {
              "paramName": "MP",
              "description": "MP",
              "sequence": 3
            }
          ]
        }
        {
          "source": {
            "instanceName": "instance_1"
          }
        }
      ]
    }

如何有效地递归排序以按字母顺序显示键值上的排序。 预期输出:

{
      "settingsList": [
        {
          "category": [
            {
              "categoryName": "BALL",
              "description": "BALL",
              "sequence": 2
            },
            {
              "categoryName": "DRIVER",
              "description": "DRIVER",
              "sequence": 1
            },
            {
              "categoryName": "SAMPLE",
              "description": "SAMPLE",
              "sequence": 3
            },
            {
              "categoryName": "USER",
              "description": "USER",
              "sequence": 4
            }
          ]
        },
        {
          "category2": [
            {
              "paramName": "CPP",
              "description": "CPP",
              "sequence": 1
            },
            {
              "paramName": "MP",
              "description": "MP",
              "sequence": 3
            },
            {
              "paramName": "PP",
              "description": "PP",
              "sequence": 2
            }
          ]
        },
        {
          "source": {
            "instanceName": "instance_1"
          }
        }
      ]
    }

下面是尝试过的示例代码

var object = {
      "settingsList": [
        {
          "category1": [
            {
              "categoryName": "DRIVER",
              "description": "DRIVER",
              "sequence": 1
            },
            {
              "categoryName": "BALL",
              "description": "BALL",
              "sequence": 2
            },
            {
              "categoryName": "SAMPLE",
              "description": "SAMPLE",
              "sequence": 3
            },
            {
              "categoryName": "USER",
              "description": "USER",
              "sequence": 4
            }
          ]
        },
        {
          "category2": [
            {
              "paramName": "CPP",
              "description": "CPP",
              "sequence": 1
            },
            {
              "paramName": "PP",
              "description": "PP",
              "sequence": 2
            },
            {
              "paramName": "MP",
              "description": "MP",
              "sequence": 3
            }
          ]
        },
        {
          "source": {
            "instanceName": "instance_1"
          }
        }
      ]
    }

var keys = Object.keys(object);

var sortedKeys = keys.sort((key1, key2)=>{
    key1 = key1.toLowerCase();
    key2 = key2.toLowerCase();
    if(key1 < key2) return -1;
    if(key1 > key2) return 1;
    return 0;
})

 function sortData(object){
    var newObject = {},
        keys = Object.keys(object);
        
   keys.sort(function(key1, key2){
        key1 = key1.toLowerCase();
        key2 = key2.toLowerCase();
        if(key1 < key2) return -1;
        if(key1 > key2) return 1;
        return 0;
    });


  for(var index in keys){
        var key = keys[index];
        if(typeof object[key] == 'object' && !(object[key] instanceof Array)){
            newObject[key] = sortData(object[key]);
        } else {
            newObject[key] = object[key];
        }
    }

    return newObject;
}

var sortedData=sortData(object)

console.log(sortedData)

..................................... ………………………………………………………………………………………………………………………………………………………… ………………………………………………………………………………………………………………………………………………………… ………………………………………………………………………………………………………………………………………………………… ………………………………………………………………………………………………………………………………………………………… ......

2 个答案:

答案 0 :(得分:0)

您尝试实现的目标称为深度排序。

您可以使用 deep-sort-object 库如下:

var sortobject = require('deep-sort-object');
var sortedData = sortobject(object);
console.log(sortedData);

或者,如果您不想使用库,您可以使用此 gist 作为参考。

答案 1 :(得分:0)

这是一个使用 object-scan

的迭代解决方案

// const objectScan = require('object-scan');

const myData = { settingsList: [{ category1: [{ categoryName: 'DRIVER', description: 'DRIVER', sequence: 1 }, { categoryName: 'BALL', description: 'BALL', sequence: 2 }, { categoryName: 'SAMPLE', description: 'SAMPLE', sequence: 3 }, { categoryName: 'USER', description: 'USER', sequence: 4 }] }, { category2: [{ paramName: 'CPP', description: 'CPP', sequence: 1 }, { paramName: 'PP', description: 'PP', sequence: 2 }, { paramName: 'MP', description: 'MP', sequence: 3 }] }, { source: { instanceName: 'instance_1' } }] };

const sort = (data) => {
  const logic = {
    'settingsList[*].category1': (value) => value.sort((a, b) => a.categoryName.localeCompare(b.categoryName)),
    'settingsList[*].category2': (value) => value.sort((a, b) => a.paramName.localeCompare(b.paramName))
  };

  objectScan(Object.keys(logic), {
    filterFn: ({ value, matchedBy }) => {
      matchedBy.forEach((needle) => logic[needle](value));
    }
  })(data);
};

console.log(sort(myData));
// => undefined

console.log(myData);
// => { settingsList: [ { category1: [ { categoryName: 'BALL', description: 'BALL', sequence: 2 }, { categoryName: 'DRIVER', description: 'DRIVER', sequence: 1 }, { categoryName: 'SAMPLE', description: 'SAMPLE', sequence: 3 }, { categoryName: 'USER', description: 'USER', sequence: 4 } ] }, { category2: [ { paramName: 'CPP', description: 'CPP', sequence: 1 }, { paramName: 'MP', description: 'MP', sequence: 3 }, { paramName: 'PP', description: 'PP', sequence: 2 } ] }, { source: { instanceName: 'instance_1' } } ] }
.as-console-wrapper {max-height: 100% !important; top: 0}
<script src="https://bundle.run/object-scan@14.4.0"></script>

免责声明:我是object-scan

的作者
相关问题