按键对JavaScript对象排序

按键对JavaScript对象排序,javascript,sorting,Javascript,Sorting,我需要按键对JavaScript对象进行排序 因此: { 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' } 将成为: { 'a' : 'dsfdsfsdf', 'b' : 'asdsad', 'c' : 'masdas' } JavaScript对象1未排序。试图“分类”它们是没有意义的。如果要迭代对象的属性,可以对键进行排序,然后检索关联的值: var myObj={ “b”:“asdsadfd”, ‘c’:‘masdasaf’, “

我需要按键对JavaScript对象进行排序

因此:

{ 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' }
将成为:

{ 'a' : 'dsfdsfsdf', 'b' : 'asdsad', 'c' : 'masdas' }
JavaScript对象1未排序。试图“分类”它们是没有意义的。如果要迭代对象的属性,可以对键进行排序,然后检索关联的值:

var myObj={
“b”:“asdsadfd”,
‘c’:‘masdasaf’,
“a”:“dsfdsfsdf”
},
键=[],
k、 我,兰,;
对于(myObj中的k){
if(myObj.hasOwnProperty(k)){
按键。按(k);
}
}
keys.sort();
len=键。长度;
对于(i=0;i
这对我很有用

/**
 * Return an Object sorted by it's Key
 */
var sortObjectByKey = function(obj){
    var keys = [];
    var sorted_obj = {};

    for(var key in obj){
        if(obj.hasOwnProperty(key)){
            keys.push(key);
        }
    }

    // sort keys
    keys.sort();

    // create new array based on Sorted Keys
    jQuery.each(keys, function(i, key){
        sorted_obj[key] = obj[key];
    });

    return sorted_obj;
};

使用lodash,这将起作用:

some_map = { 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' }

// perform a function in order of ascending key
_(some_map).keys().sort().each(function (key) {
  var value = some_map[key];
  // do something
});

// or alternatively to build a sorted list
sorted_list = _(some_map).keys().sort().map(function (key) {
  var value = some_map[key];
  // return something that shall become an item in the sorted list
}).value();

值得思考。

假设它在显示无序对象属性的VisualStudio调试器中很有用

(function(s) {
    var t = {};

    Object.keys(s).sort().forEach(function(k) {
        t[k] = s[k]
    });

    return t
})({
    b: 2,
    a: 1,
    c: 3
});
与内联版本相同:

(function(s){var t={};Object.keys(s).sort().forEach(function(k){t[k]=s[k]});return t})({b:2,a:1,c:3})

如果有嵌套对象或嵌套数组obj,请使用此代码

var sortObjectByKey = function(obj){
    var keys = [];
    var sorted_obj = {};
    for(var key in obj){
        if(obj.hasOwnProperty(key)){
            keys.push(key);
        }
    }
    // sort keys
    keys.sort();

    // create new array based on Sorted Keys
    jQuery.each(keys, function(i, key){
        var val = obj[key];
        if(val instanceof Array){
            //do for loop;
            var arr = [];
            jQuery.each(val,function(){
                arr.push(sortObjectByKey(this));
            }); 
            val = arr;

        }else if(val instanceof Object){
            val = sortObjectByKey(val)
        }
        sorted_obj[key] = val;
    });
    return sorted_obj;
};

如前所述,对象是无序的

然而

您可能会发现这个成语很有用:

var o = { 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' };

var kv = [];

for (var k in o) {
  kv.push([k, o[k]]);
}

kv.sort()
然后,您可以遍历kv并做任何您想做的事情

> kv.sort()
[ [ 'a', 'dsfdsfsdf' ],
  [ 'b', 'asdsad' ],
  [ 'c', 'masdas' ] ]

很多人都提到,“对象无法排序”,但在此之后,他们为您提供了一个有效的解决方案。悖论,不是吗

没有人提到这些解决方案为什么有效。它们是,因为在大多数浏览器的实现中,对象中的值是按添加顺序存储的。这就是为什么如果从已排序的键列表创建新对象,它将返回预期结果

我认为我们可以再添加一个解决方案–ES5功能方式:

function sortObject(obj) {
    return Object.keys(obj).sort().reduce(function (result, key) {
        result[key] = obj[key];
        return result;
    }, {});
}
上述ES2015版本(格式为“一行”):

上述示例的简要说明(如评论中所述):

Object.keys
为我们提供了所提供对象中的键列表(
obj
o
),然后我们使用默认排序算法对这些键进行排序,接下来
。reduce
用于将该数组转换回一个对象,但这一次所有键都已排序。

:

如果您不信任浏览器保持键的顺序,我强烈建议您使用键-值配对数组的有序数组

_.sortBy(_.pairs(c),function(o){return o[0]})

这个问题的其他答案已经过时,从未与实施现实相匹配,并且随着ES6/ES2015规范的发布,正式地变得不正确


见:

所有在属性键上进行迭代的方法的顺序相同:

  • 首先是所有数组索引,按数字排序
  • 然后按创建顺序创建所有字符串键(不是索引)
  • 然后是所有符号,按照它们被创建的顺序
  • 是的,JavaScript对象实际上是有序的,它们的键/属性的顺序可以改变

    以下是如何按对象的键/属性按字母顺序对对象进行排序:

    const无序={
    ‘b’:‘foo’,
    ‘c’:‘bar’,
    “a”:“baz”
    };
    log(JSON.stringify(无序));
    // → '{“b”:“foo”,“c”:“bar”,“a”:“baz”}'
    const ordered=Object.keys(无序).sort().reduce(
    (obj,key)=>{
    obj[键]=无序[键];
    返回obj;
    }, 
    {}
    );
    log(JSON.stringify(ordered));
    
    // → '{“a”:“baz”,“b”:“foo”,“c”:“bar”}
    解决方案:

    function getSortedObject(object) {
      var sortedObject = {};
    
      var keys = Object.keys(object);
      keys.sort();
    
      for (var i = 0, size = keys.length; i < size; i++) {
        key = keys[i];
        value = object[key];
        sortedObject[key] = value;
      }
    
      return sortedObject;
    }
    
    // Test run
    getSortedObject({d: 4, a: 1, b: 2, c: 3});
    
    函数getSortedObject(对象){ var sortedObject={}; var keys=Object.keys(Object); keys.sort(); 对于(变量i=0,大小=keys.length;i 说明:

    function getSortedObject(object) {
      var sortedObject = {};
    
      var keys = Object.keys(object);
      keys.sort();
    
      for (var i = 0, size = keys.length; i < size; i++) {
        key = keys[i];
        value = object[key];
        sortedObject[key] = value;
      }
    
      return sortedObject;
    }
    
    // Test run
    getSortedObject({d: 4, a: 1, b: 2, c: 3});
    
    许多JavaScript运行时按照添加值的顺序在对象中存储值

    要按对象的键对其属性进行排序,可以使用返回键数组的函数。然后,可以通过对数组元素进行适当排序的方法对键数组进行排序(无需将它们分配给新变量)

    对键进行排序后,可以开始逐个使用它们来访问旧对象的内容,以填充新对象(现在已排序)

    以下是该过程的示例(您可以在目标浏览器中进行测试):

    /**
    *返回对象的副本,该副本按原始对象的键排序。
    *
    *@param{Object}Object-原始对象。
    *@返回按键排序的原始对象的{Object}副本。
    */
    函数getSortedObject(对象){
    //将使用排序键返回的新对象
    var sortedObject={};
    //从旧/当前对象获取密钥数组
    var keys=Object.keys(Object);
    //排序键(就地)
    keys.sort();
    //使用排序键将值从旧对象复制到新对象
    对于(变量i=0,大小=keys.length;i}
    简单易读的代码片段,使用lodash

    只有在调用sortBy时,您才需要将密钥加引号。它不必在数据本身中加引号

    _.sortBy(myObj, "key")
    
    另外,要映射的第二个参数是错误的。这应该是一个功能,但使用弹拨更容易

    _.map( _.sortBy(myObj, "key") , "value");
    

    也许更优雅一点:

    /**
    *按键对键值对象排序,保持键到数据的相关性。
    *@param{Object}src键值对象
    *@返回{Object}
    */
    var ksort=函数(src){
    变量键=对象键(src),
    目标={};
    keys.sort();
    
    _.map( _.sortBy(myObj, "key") , "value");
    
        Object.keys(unordered).sort().forEach(function(key) {
            var value = unordered[key];
            delete unordered[key];
            unordered[key] = value;
        });
    
    function osort(obj) {
    var keys = Object.keys(obj);
    var len = keys.length;
    var rObj = [];
    var rK = [];
    var t = Object.keys(obj).length;
    while(t > rK.length) {
        var l = null;
        for(var x in keys) {
            if(l && parseInt(keys[x]) < parseInt(l)) {
                l = keys[x];
                k = x;
            }
            if(!l) { // Find Lowest
                var l = keys[x];
                var k = x;
            }
        }
        delete keys[k];
        rK.push(l);
    }
    
    for (var i = 0; i < len; i++) {
    
        k = rK[i];
        rObj.push(obj[k]);
    }
    return rObj;
    }
    
    /**
     * Sort of the keys of an object alphabetically
     */
    const sortKeys = function(obj) {
      if(_.isArray(obj)) {
        return obj.map(sortKeys);
      }
      if(_.isObject(obj)) {
        return _.fromPairs(_.keys(obj).sort().map(key => [key, sortKeys(obj[key])]));
      }
      return obj;
    };
    
    var o = { 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' };
    console.log(_(o).toPairs().sortBy(0).fromPairs().value())
    
    $ npm install --save sort-keys
    
    const sortKeys = require('sort-keys');
    
    sortKeys({c: 0, a: 0, b: 0});
    //=> {a: 0, b: 0, c: 0}
    
    sortKeys({b: {b: 0, a: 0}, a: 0}, {deep: true});
    //=> {a: 0, b: {a: 0, b: 0}}
    
    sortKeys({c: 0, a: 0, b: 0}, {
        compare: (a, b) => -a.localeCompare(b)
    });
    //=> {c: 0, b: 0, a: 0}
    
    function sortObjectKeys(obj){
        return Object.keys(obj).sort().reduce((acc,key)=>{
            acc[key]=obj[key];
            return acc;
        },{});
    }
    
    sortObjectKeys({
        telephone: '069911234124',
        name: 'Lola',
        access: true,
    });
    
    function sortObjectKeys(obj){
        return Object.keys(obj).sort().reduce((acc,key)=>{
            if (Array.isArray(obj[key])){
                acc[key]=obj[key].map(sortObjectKeys);
            }
            if (typeof obj[key] === 'object'){
                acc[key]=sortObjectKeys(obj[key]);
            }
            else{
                acc[key]=obj[key];
            }
            return acc;
        },{});
    }
    
    // test it
    sortObjectKeys({
        telephone: '069911234124',
        name: 'Lola',
        access: true,
        cars: [
            {name: 'Family', brand: 'Volvo', cc:1600},
            {
                name: 'City', brand: 'VW', cc:1200, 
                interior: {
                    wheel: 'plastic',
                    radio: 'blaupunkt'
                }
            },
            {
                cc:2600, name: 'Killer', brand: 'Plymouth',
                interior: {
                    wheel: 'wooden',
                    radio: 'earache!'
                }
            },
        ]
    });
    
    function sortKeys(o){
        if(o && o.constructor === Array)
            o.forEach(i=>sortKeys(i));
        else if(o && o.constructor === Object)
            Object.entries(o).sort((a,b)=>a[0]>b[0]?1:-1).forEach(e=>{
                sortKeys(e[1]);
                delete o[e[0]];
                o[e[0]] = e[1];
            });
    }
    
    let x = {d:3, c:{g:20, a:[3,2,{s:200, a:100}]}, a:1};
    let y = x.c;
    let z = x.c.a[2];
    sortKeys(x);
    console.log(x); // {a: 1, c: {a: [3, 2, {a: 1, s: 2}], g: 2}, d: 3}
    console.log(y); // {a: [3, 2, {a: 100, s: 200}}, g: 20}
    console.log(z); // {a: 100, s: 200}
    
    // Only numbers to show it will be sorted.
    const testObj = {
      '2000': 'Articel1',
      '4000': 'Articel2',
      '1000': 'Articel3',
      '3000': 'Articel4',
    };
    
    // I'll explain what reduces does after the answer.
    console.log(Object.keys(testObj).reduce((accumulator, currentValue) => {
      accumulator[currentValue] = testObj[currentValue];
      return accumulator;
    }, {}));
    
    /**
     * expected output:
     * {
     * '1000': 'Articel3',
     * '2000': 'Articel1',
     * '3000': 'Articel4',
     * '4000': 'Articel2' 
     *  } 
     */
    
    // if needed here is the one liner:
    console.log(Object.keys(testObj).reduce((a, c) => (a[c] = testObj[c], a), {}));
    
    // String example
    const testObj = {
      'a1d78eg8fdg387fg38': 'Articel1',
      'z12989dh89h31d9h39': 'Articel2',
      'f1203391dhj32189h2': 'Articel3',
      'b10939hd83f9032003': 'Articel4',
    };
    // Chained sort into all of this.
    console.log(Object.keys(testObj).sort().reduce((accumulator, currentValue) => {
      accumulator[currentValue] = testObj[currentValue];
      return accumulator;
    }, {}));
    
    /**
     * expected output:   
     * { 
     * a1d78eg8fdg387fg38: 'Articel1',
     * b10939hd83f9032003: 'Articel4',
     * f1203391dhj32189h2: 'Articel3',
     * z12989dh89h31d9h39: 'Articel2' 
     * }
     */
    
    // again the one liner:
    console.log(Object.keys(testObj).sort().reduce((a, c) => (a[c] = testObj[c], a), {}));
    
    // Will return Keys of object as an array (sorted if only numbers or single strings like a,b,c).
    Object.keys(testObj)
    
    // Chaining reduce to the returned array from Object.keys().
    // Array.prototype.reduce() takes one callback 
    // (and another param look at the last line) and passes 4 arguments to it: 
    // accumulator, currentValue, currentIndex and array
    .reduce((accumulator, currentValue) => {
    
      // setting the accumulator (sorted new object) with the actual property from old (unsorted) object.
      accumulator[currentValue] = testObj[currentValue];
    
      // returning the newly sorted object for the next element in array.
      return accumulator;
    
      // the empty object {} ist the initial value for  Array.prototype.reduce().
    }, {});
    
    Object.keys(testObj).reduce(
    
      // Arrow function as callback parameter.
      (a, c) => 
    
      // parenthesis return! so we can safe the return and write only (..., a);
      (a[c] = testObj[c], a)
    
      // initial value for reduce.
      ,{}
    );
    
    const object1 = {
      a: 'somestring',
      b: 42,
      c: false
    };
    
    console.log(Object.keys(object1));
    // expected output: Array ["a", "b", "c"]
    
    // simple array
    const arr = ['a', 'b', 'c'];
    console.log(Object.keys(arr)); // console: ['0', '1', '2']
    
    // This is just to show what happens, please don't use symbols in keys.
    const testObj = {
      '1asc': '4444',
      1000: 'a',
      b: '1231',
      '#01010101010': 'asd',
      2: 'c'
    };
    
    console.log(Object.keys(testObj));
    // output: [ '2', '1000', '1asc', 'b', '#01010101010' ]
    
    console.log(Object.keys(testObj).sort());
    // output: [ '#01010101010', '1000', '1asc', '2', 'b' ]
    
    Object.fromEntries(Object.entries({b: 3, a:8, c:1}).sort())
    
    Object.keys(unordered).sort().reduce(
        (acc,curr) => ({...acc, [curr]:unordered[curr]})
        , {}
    )
    
    Object.entries(unordered)
      .sort(([keyA], [keyB]) => keyA > keyB)
      .reduce((obj, [key,value]) => Object.assign(obj, {[key]: value}), {})
    
    function sortObj(obj) {
        if (typeof obj !== "object" || obj === null)
            return obj;
    
        if (Array.isArray(obj))
            return obj.map((e) => sortObj(e)).sort();
    
        return Object.keys(obj).sort().reduce((sorted, k) => {
            sorted[k] = sortObj(obj[k]);
            return sorted;
        }, {});
    }
    
    function sortObject(unordered, sortArrays = false) {
      if (!unordered || typeof unordered !== 'object') {
        return unordered;
      }
    
      if (Array.isArray(unordered)) {
        const newArr = unordered.map((item) => sortObject(item, sortArrays));
        if (sortArrays) {
          newArr.sort();
        }
        return newArr;
      }
    
      const ordered = {};
      Object.keys(unordered)
        .sort()
        .forEach((key) => {
          ordered[key] = sortObject(unordered[key], sortArrays);
        });
      return ordered;
    }
    
    const json = {
      b: 5,
      a: [2, 1],
      d: {
        b: undefined,
        a: null,
        c: false,
        d: true,
        g: '1',
        f: [],
        h: {},
        i: 1n,
        j: () => {},
        k: Symbol('a')
      },
      c: [
        {
          b: 1,
          a: 1
        }
      ]
    };
    console.log(sortObject(json, true));