Сортировка объекта JavaScript по значению свойства

Если у меня есть объект JavaScript, такой как:

var list = {
  "you": 100, 
  "me": 75, 
  "foo": 116, 
  "bar": 15
};

Есть ли способ сортировки свойств по значению? Так что я в конечном итоге

list = {
  "bar": 15, 
  "me": 75, 
  "you": 100, 
  "foo": 116
};
 Govind Rai29 окт. 2016 г., 02:31
Before you read the answers: ОтветNo, Порядок свойств объекта является нестандартным в ECMAScript. Вы никогда не должны делать предположения о порядке элементов в объекте JavaScript. Объект - это неупорядоченная коллекция свойств. Ответы ниже показывают, как & quot; использовать & quot; сортировать свойства, используя массивы, но фактически никогда не изменяйте порядок свойств самих объектов.So, no, it's not possible. Даже если вы строите объект с предварительно отсортированными свойствами, это не гарантирует, что они будут отображаться в том же порядке в будущем. Читать дальше :).
 Sampson01 июл. 2009 г., 17:12
Не только & quot; сортировка & quot; но важнее сортировка чисел. Числа невосприимчивы к методу Javascripts Array.sort (), что означает, что вам не нужно просто находить метод для сортировки свойств, а вам нужно написать собственную функцию для сравнения числовых значений.
 T.J. Crowder31 дек. 2016 г., 17:22
@GovindRai:There is now средство доступа к свойствам в указанном порядке в спецификации. Это хорошая идея? Почти наверняка нет. :-) Но там, начиная с ES2015.
 Govind Rai31 дек. 2016 г., 21:17
@ T.J.Crowder ах, ты абсолютно прав. Тем не менее, со всеми оговорками, которые идут с этим дополнением, я надеюсь, что наши коллеги SO прочитают границу перед принятием этого нового подхода (как всегда следует). : D
 ProblemsOfSumit19 дек. 2016 г., 16:27
@GovindRai, однако, в реальных веб-приложениях мы перебираем коллекции объектов с идентификаторами в качестве ключей, и порядок важен при переводе в шаблоны HTML. Вы говорите, что у них нет порядка, я говорю, что у них есть именно тот порядок, который я вижу, когда console.log их в текущем браузере. И этот порядок может быть переупорядочен. Как только вы зациклились на них, у них есть заказ.

Ответы на вопрос(28)

Спасибо и продолжайте отвечать @Nosredna

Теперь, когда мы понимаем, что объект нужно преобразовать в массив, затем сортируем массив. это полезно для сортировки массива (или преобразованного объекта в массив) по строке:

Object {6: Object, 7: Object, 8: Object, 9: Object, 10: Object, 11: Object, 12: Object}
   6: Object
   id: "6"
   name: "PhD"
   obe_service_type_id: "2"
   __proto__: Object
   7: Object
   id: "7"
   name: "BVC (BPTC)"
   obe_service_type_id: "2"
   __proto__: Object


    //Sort options
    var sortable = [];
    for (var vehicle in options)
    sortable.push([vehicle, options[vehicle]]);
    sortable.sort(function(a, b) {
        return a[1].name < b[1].name ? -1 : 1;
    });


    //sortable => prints  
[Array[2], Array[2], Array[2], Array[2], Array[2], Array[2], Array[2]]
    0: Array[2]
    0: "11"
    1: Object
        id: "11"
        name: "AS/A2"
        obe_service_type_id: "2"
        __proto__: Object
        length: 2
        __proto__: Array[0]
    1: Array[2]
    0: "7"
    1: Object
        id: "7"
        name: "BVC (BPTC)"
        obe_service_type_id: "2"
        __proto__: Object
        length: 2

Couln't найти ответ выше, который будет работать и будетSMALLи будетsupport nested объекты (не массивы), поэтому я написал свой собственный :) Работает как со строками, так и с целыми числами.

  function sortObjectProperties(obj, sortValue){
      var keysSorted = Object.keys(obj).sort(function(a,b){return obj[a][sortValue]-obj[b][sortValue]});
      var objSorted = {};
      for(var i = 0; i < keysSorted.length; i++){
          objSorted[keysSorted[i]] = obj[keysSorted[i]];
      }
      return objSorted;
    }

Использование:

    /* sample object with unsorder properties, that we want to sort by 
    their "customValue" property */

    var objUnsorted = {
       prop1 : {
          customValue : 'ZZ'
       },
       prop2 : {
          customValue : 'AA'
       }
    }

    // call the function, passing object and property with it should be sorted out
    var objSorted = sortObjectProperties(objUnsorted, 'customValue');

    // now console.log(objSorted) will return:
    { 
       prop2 : {
          customValue : 'AA'
       },
       prop1 : {
          customValue : 'ZZ'
       } 
    }
 06 дек. 2017 г., 12:53
keysSorted сортируется в порядке возрастания sortValue, но, поскольку объект javascript представляет собой неупорядоченную коллекцию свойств, нет смысла пытаться упорядочить эти свойства.

Если у меня есть такой объект,

var dayObj = {
              "Friday":["5:00pm to 12:00am"] ,
              "Wednesday":["5:00pm to 11:00pm"],
              "Sunday":["11:00am to 11:00pm"], 
              "Thursday":["5:00pm to 11:00pm"],
              "Saturday":["11:00am to 12:00am"]
           }

хочу отсортировать по порядку дня,

у нас должен быть daySorterMap сначала,

var daySorterMap = {
  // "sunday": 0, // << if sunday is first day of week
  "Monday": 1,
  "Tuesday": 2,
  "Wednesday": 3,
  "Thursday": 4,
  "Friday": 5,
  "Saturday": 6,
  "Sunday": 7
}

Инициировать отдельный объект sortedDayObj,

var sortedDayObj={};
Object.keys(dayObj)
.sort((a,b) => daySorterMap[a] - daySorterMap[b])
.forEach(value=>sortedDayObj[value]= dayObj[value])

Вы можете вернуть sortedDayObj

Я сделал плагин только для этого, он принимает 1 аргумент, который является несортированным объектом, и возвращает объект, который был отсортирован по значению проп. Это будет работать на всех двухмерных объектах, таких как{"Nick": 28, "Bob": 52}...

var sloppyObj = {
    'C': 78,
    'A': 3,
    'B': 4
};

// Extend object to support sort method
function sortObj(obj) {
    "use strict";

    function Obj2Array(obj) {
        var newObj = [];
        for (var key in obj) {
            if (!obj.hasOwnProperty(key)) return;
            var value = [key, obj[key]];
            newObj.push(value);
        }
        return newObj;
    }

    var sortedArray = Obj2Array(obj).sort(function(a, b) {
        if (a[1] < b[1]) return -1;
        if (a[1] > b[1]) return 1;
        return 0;
    });

    function recreateSortedObject(targ) {
        var sortedObj = {};
        for (var i = 0; i < targ.length; i++) {
            sortedObj[targ[i][0]] = targ[i][1];
        }
        return sortedObj;
    }
    return recreateSortedObject(sortedArray);
}

var sortedObj = sortObj(sloppyObj);

alert(JSON.stringify(sortedObj));

Here is a demo of the function working as expected http://codepen.io/nicholasabrams/pen/RWRqve?editors=001

OKКак вы знаете, JavaScript имеетsort() функция, чтобы отсортировать массивы, но ничего для объекта ...

Таким образом, в этом случае нам нужно каким-то образом получить массив ключей и отсортировать их, вот почему apis дает вам объекты в массиве большую часть времени, потому что Array имеет больше встроенных функций для работы с ними, чем в любом случае литерал объекта, быстрое утешение используетObject.key которые возвращают массив ключей объекта, я создаюES6 ниже функция, которая делает работу за вас, она использует роднойsort() а такжеreduce() функции в JavaScript:

function sortObject(obj) {
  return Object.keys(obj)
    .sort().reduce((a, v) => {
    a[v] = obj[v];
    return a; }, {});
}

И теперь вы можете использовать это так:

let myObject = {a: 1, c: 3, e: 5, b: 2, d: 4};
let sortedMyObject = sortObject(myObject);

Проверьте sortedMyObject, и вы можете увидеть результат, отсортированный по ключам следующим образом:

{a: 1, b: 2, c: 3, d: 4, e: 5}

Также таким образом, основной объект не будет затронут, и мы фактически получим новый объект.

Я также создаю изображение ниже, чтобы сделать шаги функции более понятными, на случай, если вам нужно немного изменить его, чтобы он работал по-вашему:

Sorting a javascript object by property value

 23 апр. 2018 г., 05:23
@VtoCorleone Это просто естественная ошибка сортировки, сначала идет 1, а не недостаток в представленном алгоритме.
 28 авг. 2017 г., 11:39
Это сортировка по ключу, а не по значению.
 28 авг. 2017 г., 12:35
@ROROROOROROR, это всего лишь указание на то, как это работает, поскольку они не такие разные, но все хорошо, я добавлю сортировку по значению тоже
 01 нояб. 2017 г., 19:32
Сортировка по значению неверна, и это ваш набор данных. + Изменитьc: 3 вc: 13 и вы увидите, что он развалится.

Ваши объекты могут иметь любое количество свойств, и вы можете выбрать сортировку по любому желаемому свойству объекта по номеру или строке, если вы поместите объекты в массив, n. Рассмотрим этот массив:

var arrayOfObjects = [   
    {
        name: 'Diana',
        born: 1373925600000, // Mon, Jul 15 2013
        num: 4,
        sex: 'female'
    },
    {

        name: 'Beyonce',
        born: 1366832953000, // Wed, Apr 24 2013
        num: 2,
        sex: 'female'
    },
    {            
        name: 'Albert',
        born: 1370288700000, // Mon, Jun 3 2013
        num: 3,
        sex: 'male'
    },    
    {
        name: 'Doris',
        born: 1354412087000, // Sat, Dec 1 2012
        num: 1,
        sex: 'female'
    }
];

сортировать по дате рождения

// use slice() to copy the array and not just make a reference
var byDate = arrayOfObjects.slice(0);
byDate.sort(function(a,b) {
    return a.born - b.born;
});
console.log('by date:');
console.log(byDate);

Сортировать по имени

var byName = arrayOfObjects.slice(0);
byName.sort(function(a,b) {
    var x = a.name.toLowerCase();
    var y = b.name.toLowerCase();
    return x < y ? -1 : x > y ? 1 : 0;
});

console.log('by name:');
console.log(byName);

http://jsfiddle.net/xsM5s/16/

 15 апр. 2018 г., 21:36
Это массив объектов, который не является запрашиваемым OP (объект с несколькими свойствами)
 23 мар. 2017 г., 19:44
@inorganik Да, очень хорошая заметка для тех, кому нужно поддерживать эти браузеры.
 22 мар. 2017 г., 18:51
@JemarJoneslocalCompare выглядит как очень полезная функция! Просто отметьте, что он не будет поддерживаться в каждом браузере - IE 10 и менее, Safari Mobile 9 и менее.
 12 мар. 2014 г., 20:55
Сортировать по названию не следуетsubstr из первого персонажа; ещеDiana а такжеDebra иметь неопределенный заказ. Кроме того, вашbyDate сортировка на самом деле используетnumнеborn.
 22 мар. 2017 г., 16:38
Это выглядит хорошо, но обратите внимание, что для сравнения строк вы можете просто использоватьx.localeCompare(y)
var list = {
    "you": 100,
    "me": 75,
    "foo": 116,
    "bar": 15
};
var tmpList = {};
while (Object.keys(list).length) {
    var key = Object.keys(list).reduce((a, b) => list[a] > list[b] ? a : b);
    tmpList[key] = list[key];
    delete list[key];
}
list = tmpList;
console.log(list); // { foo: 116, you: 100, me: 75, bar: 15 }

Мы не хотим дублировать всю структуру данных или использовать массив, где нам нужен ассоциативный массив.

Вот еще один способ сделать то же самое, что и Бонна:

var list = {"you": 100, "me": 75, "foo": 116, "bar": 15};
keysSorted = Object.keys(list).sort(function(a,b){return list[a]-list[b]})
console.log(keysSorted);     // bar,me,you,foo

 10 янв. 2018 г., 16:00
Если вы добавите.map(key => list[key]); в конце сортировки он вернет весь объект, а не только ключ
 06 февр. 2017 г., 16:14
Не забывайте.keysSorted это массив! Не объект!
 07 янв. 2015 г., 05:26
Похоже, что это сортировка по ключу, а не по значению, а это не то, что требовал вопрос?
 22 июл. 2015 г., 23:16
Он сортируется по значению и отображает ключи, но мы теряем значение счетчика при его печати, поскольку оно печатает только ключи.
 06 нояб. 2015 г., 21:59
Порядок свойств объекта не гарантируется в JavaScript, поэтому сортировку следует выполнять в массиве, а не в объекте (который вы называете «ассоциативным массивом»).
function sortObjByValue(list){
 var sortedObj = {}
 Object.keys(list)
  .map(key => [key, list[key]])
  .sort((a,b) => a[1] > b[1] ? 1 : a[1] < b[1] ? -1 : 0)
  .forEach(data => sortedObj[data[0]] = data[1]);
 return sortedObj;
}
sortObjByValue(list);

Github GistСсылка на сайт

& Quot; со стрелками & quot; версия @marcusR 'sответ для справки

var myObj = {"you": 100, "me": 75, "foo": 116, "bar": 15};
keysSorted = Object.keys(myObj).sort((a,b) => myObj[a]-myObj[b])
alert(keysSorted);     // bar,me,you,foo

UPDATE: April 2017  - Это возвращает отсортированныйmyObj объект, определенный выше.

Object
 .keys(myObj)
 .sort((a, b) => myObj[a]-myObj[b])
 .reduce((_sortedObj, key) => ({
   ..._sortedObj, 
   [key]: myObj[key]
 }), {})

Попробуй это здесь!

UPDATE: October 2018 - Object.entries версия

Object
 .entries(myObj)
 .sort()
 .reduce((_sortedObj, [k,v]) => ({
   ..._sortedObj, 
   [k]: v
 }), {})

Попробуй это здесь!

 05 янв. 2018 г., 11:03
не работает дляvar myObj = {"1": {"Value": 40}, "2": {"Value": 10}, "3": {"Value": 30}, "4": {"Value": 20}};
 06 янв. 2018 г., 13:21
Вопрос OP, наряду с этим ответом, не содержит вложенных объектов @Rohanil Может быть, вы хотите задать другой вопрос вместо голосования с понижением. Ваш вложенный объект с различными типами, очевидно, нуждается в большем, чем это решение
 04 февр. 2019 г., 23:15
Примечание. Вы не хотите использоватьsort() наObject.entries()
 29 окт. 2018 г., 00:07
Да @ZorgoZ, вы правы, и многие люди упоминали об этом в этом посте. Большую часть времени мы используем эту функцию как преобразование перед преобразованием в другой тип (например, JSON) или перед другой функцией приведения. Если цель состоит в том, чтобы изменить объект после этого, тогда могут быть неожиданные результаты. Я имел успех с этой функцией через двигатели.
 25 окт. 2018 г., 12:49
Просто примечание: ваши обновления не будут работать на самом деле. По крайней мере, не везде и не из-заentries, Согласно стандарту, объектis an unordered collection of properties, Что ж, это означает, что если вы пытаетесь создать новый объект после сортировки его по значению свойства или чему-либо еще, порядок ключей свойства снова становится неопределенным. Например, Chrome по умолчанию упорядочивает ключи свойств, поэтому каждая попытка упорядочить их по-другому бесполезна. Ваш единственный шанс - получить & quot; индекс & quot; на основе ваших предпочтений заказа и пройти оригинальный объект соответственно.

function sortObject(list) {
  var sortable = [];
  for (var key in list) {
    sortable.push([key, list[key]]);
  }

  sortable.sort(function(a, b) {
    return (a[1] > b[1] ? -1 : (a[1] < b[1] ? 1 : 0));
  });

  var orderedList = {};
  for (var i = 0; i < sortable.length; i++) {
    orderedList[sortable[i][0]] = sortable[i][1];
  }

  return orderedList;
}

Попробуй это. Даже ваш объект не имеет свойства, на основе которого вы пытаетесь отсортировать, также будет обрабатываться.

Просто позвоните, отправив свойство с объектом.

var sortObjectByProperty = function(property,object){

    console.time("Sorting");
    var  sortedList      = [];
         emptyProperty   = [];
         tempObject      = [];
         nullProperty    = [];
    $.each(object,function(index,entry){
        if(entry.hasOwnProperty(property)){
            var propertyValue = entry[property];
            if(propertyValue!="" && propertyValue!=null){
              sortedList.push({key:propertyValue.toLowerCase().trim(),value:entry});  
            }else{
                emptyProperty.push(entry);
           }
        }else{
            nullProperty.push(entry);
        }
    });

      sortedList.sort(function(a,b){
           return a.key < b.key ? -1 : 1;
         //return a.key < b.key?-1:1;   // Asc 
         //return a.key < b.key?1:-1;  // Desc
      });


    $.each(sortedList,function(key,entry){
        tempObject[tempObject.length] = entry.value;
     });

    if(emptyProperty.length>0){
        tempObject.concat(emptyProperty);
    }
    if(nullProperty.length>0){
        tempObject.concat(nullProperty);
    }
    console.timeEnd("Sorting");
    return tempObject;
}
Решение Вопроса

Переместите их в массив, отсортируйте этот массив, а затем используйте этот массив для своих целей. Вот решение:

var maxSpeed = {
    car: 300, 
    bike: 60, 
    motorbike: 200, 
    airplane: 1000,
    helicopter: 400, 
    rocket: 8 * 60 * 60
};
var sortable = [];
for (var vehicle in maxSpeed) {
    sortable.push([vehicle, maxSpeed[vehicle]]);
}

sortable.sort(function(a, b) {
    return a[1] - b[1];
});

//[["bike", 60], ["motorbike", 200], ["car", 300],
//["helicopter", 400], ["airplane", 1000], ["rocket", 28800]]

Получив массив, вы можете перестроить объект из массива в том порядке, который вам нравится, и таким образом добиться именно того, что вы намеревались сделать. Это будет работать во всех известных мне браузерах, но будет зависеть от особенностей реализации и может сломаться в любое время. Вы никогда не должны делать предположения о порядке элементов в объекте JavaScript.

 20 февр. 2014 г., 15:45
_.pairs превращает объект в [[key1, value1], [key2, value2]]. Тогда назовите сортировку по этому вопросу. Тогда позвони_.object на нем, чтобы повернуть его обратно.
 28 нояб. 2012 г., 10:07
@TheBrain: просто чтобы добавить,keys() поддерживается только IE9 + (и другими современными браузерами), если это вызывает озабоченность. Такжеkeys() исключает перечислимые свойства из цепочки прототипов элементов (в отличие от for ..in), но обычно это более желательно.
 12 сент. 2012 г., 13:07
Вот более компактная версия вашего кода. Object.keys (maxSpeed) .sort (function (a, b) {return - (maxSpeed [a] - maxSpeed [b])});
 10 мар. 2015 г., 08:40
@Funkodebat AFAIK вопрос не связан с библиотекой подчеркивания ..
 15 авг. 2012 г., 17:42
Не могли бы вы переформулировать & quot; вы можете перестроить & quot; чтобы "вы могли использовать массив для поддержания порядка ключей и извлечения значений из объекта"? Это не только нестандартно, как вы сами упомянули, это ошибочное предположение нарушается большим количеством браузеров, чем просто Chrome сегодня, поэтому лучше не поощрять пользователей пробовать это.
var list = {
    "you": 100, 
    "me": 75, 
    "foo": 116, 
    "bar": 15
};

function sortAssocObject(list) {
    var sortable = [];
    for (var key in list) {
        sortable.push([key, list[key]]);
    }

    sortable.sort(function(a, b) {
        return (a[1] < b[1] ? -1 : (a[1] > b[1] ? 1 : 0));
    });

    var orderedList = {};
    for (var i = 0; i < sortable.length; i++) {
        orderedList[sortable[i][0]] = sortable[i][1];
    }

    return orderedList;
}

sortAssocObject(list);

// {bar: 15, me: 75, you: 100, foo: 116}
 29 мая 2017 г., 20:05
Порядок ключей не гарантируется в javascript, поэтому для меня это не работает, если ключи целые числа или тому подобное
 29 янв. 2018 г., 10:41
точно, ParoX. Это не работает правильно, когда ключ имеет целочисленный тип.
 27 апр. 2017 г., 17:20
Просто и отлично! Это отвечает на вопрос. Благодарю.

Вот еще один пример:

function sortObject(obj) {
  var arr = [];
  var prop;
  for (prop in obj) {
    if (obj.hasOwnProperty(prop)) {
      arr.push({
        'key': prop,
        'value': obj[prop]
      });
    }
  }
  arr.sort(function(a, b) {
    return a.value - b.value;
  });
  return arr; // returns array
}
var list = {
  car: 300,
  bike: 60,
  motorbike: 200,
  airplane: 1000,
  helicopter: 400,
  rocket: 8 * 60 * 60
};
var arr = sortObject(list);
console.log(arr);

На всякий случай, кто-то ищет сохранение объекта (с ключами и значениями), используя ссылку на код @Markus R и комментарий @James Moran, просто используйте:

var list = {"you": 100, "me": 75, "foo": 116, "bar": 15};
var newO = {};
Object.keys(list).sort(function(a,b){return list[a]-list[b]})
                 .map(key => newO[key] = list[key]);
console.log(newO);  // {bar: 15, me: 75, you: 100, foo: 116}
 08 мар. 2019 г., 19:39
Вы возвращаете назначение в этомmap, forEach было бы лучше

вот способ получить сортировку объекта и получить отсортированный объект взамен

let sortedObject = {}
sortedObject = Object.keys(yourObject).sort((a, b) => {
                        return yourObject[a] - yourObject[b] 
                    }).reduce((prev, curr, i) => {
                        prev[i] = yourObject[curr]
                        return prev
                    }, {});

Вы можете настроить свою функцию сортировки согласно вашему требованию

 25 авг. 2017 г., 20:15
Отличный ответ. Спасибо!
 05 авг. 2018 г., 09:21
Этот код просто сбивает ваш объект

Это может быть простой способ обращаться с ним как с реальным упорядоченным объектом. Не уверен, насколько это медленно. также может быть лучше с циклом while.

Object.sortByKeys = function(myObj){
  var keys = Object.keys(myObj)
  keys.sort()
  var sortedObject = Object()
  for(i in keys){
    key = keys[i]
    sortedObject[key]=myObj[key]
   }

  return sortedObject

}

И тогда я нашел эту функцию инвертирования из: http://nelsonwells.net/2011/10/swap-object-key-and-values-in-javascript/

Object.invert = function (obj) {

  var new_obj = {};

  for (var prop in obj) {
    if(obj.hasOwnProperty(prop)) {
      new_obj[obj[prop]] = prop;
    }
  }

  return new_obj;
};

Так

var list = {"you": 100, "me": 75, "foo": 116, "bar": 15};
var invertedList = Object.invert(list)
var invertedOrderedList = Object.sortByKeys(invertedList)
var orderedList = Object.invert(invertedOrderedList)

Для полноты этой функции возвращаетсяsorted array свойств объекта:

function sortObject(obj) {
    var arr = [];
    for (var prop in obj) {
        if (obj.hasOwnProperty(prop)) {
            arr.push({
                'key': prop,
                'value': obj[prop]
            });
        }
    }
    arr.sort(function(a, b) { return a.value - b.value; });
    //arr.sort(function(a, b) { a.value.toLowerCase().localeCompare(b.value.toLowerCase()); }); //use this to sort as strings
    return arr; // returns array
}

var list = {"you": 100, "me": 75, "foo": 116, "bar": 15};
var arr = sortObject(list);
console.log(arr); // [{key:"bar", value:15}, {key:"me", value:75}, {key:"you", value:100}, {key:"foo", value:116}]

Jsfiddle с кодом выше здесь, Это решение основано наЭта статья.

Обновленная скрипка для сортировки строк находится здесь. Вы можете удалить оба дополнительных преобразования .toLowerCase () из него для сравнения строк с учетом регистра.

 16 авг. 2012 г., 18:08
Как насчет массива объектов? [{name: Will}, {name: Bill}, {name: Ben}]
 14 нояб. 2018 г., 12:53
Отличное решение. Сортировка строк требует возврата
 16 авг. 2012 г., 18:29
Привет Уилл, вы можете использоватьlocaleCompare function для этого сравнения. Добавил его в ответ выше.

Объекты JavaScript неупорядочены по определению (см.Язык ECMAScript Спецификация, раздел 8.6). Спецификация языка даже не гарантирует, что если вы дважды итерируете свойства объекта подряд, они будут появляться в одном и том же порядке во второй раз.

Если вам нужно упорядочить вещи, используйте массив и метод Array.prototype.sort.

 01 июл. 2009 г., 17:43
Редактировать. Хром обычно поддерживает порядок, но не всегда. А вот соответствующая ошибка Chromium:code.google.com/p/chromium/issues/detail?id=883
 01 июл. 2009 г., 17:58
Этот отчет об ошибке неоправдан, и те, кто полагался на недокументированное поведение, являются теми с ошибками. Прочитайте раздел ECMASCript 8.6; в нем четко указано, что «Объект является неупорядоченным набором свойств». Любой, кто обнаружил, что в некоторых реализациях это не выглядело так, а затем начал зависеть от такого поведения, связанного с реализацией, совершил большую ошибку, и он не должен пытаться свалить вину с себя. Если бы я работал в команде Chrome, я бы отмечал этот отчет об ошибке как "Invalid, WontFix".
 01 июл. 2009 г., 17:37
Обратите внимание, что об этом было довольно много споров. Большинство реализаций хранят список в порядке добавления элементов. IIRC, Chrome не т. Был спор о том, должен ли Chrome соответствовать другим реализациям. Я считаю, что объект JavaScript - это хеш, и порядок не должен быть принят. Я считаю, что Python прошел через тот же аргумент, и недавно был представлен новый упорядоченный список, похожий на хэш. Для большинства браузеров вы МОЖЕТЕ делать то, что вы хотите, воссоздавая свой объект, добавляя элементы по отсортированному значению. Но вы не должны.
 20 февр. 2012 г., 18:06
@olliej - я не думаю, что это правильно. В спецификации сказано: «Механизм и порядок перечисления свойств (шаг 6.a в первом алгоритме, шаг 7.a во втором) не указан». Это на странице 92 PDF окончательного проекта.
 01 июл. 2009 г., 23:24
EcmaScript 5 фактически определяет порядок перечисления как порядок вставки - отсутствие определения считается ошибкой спецификации в ES3. Стоит отметить, что спецификация EcmaScript определяет поведение, которое никто не счел бы нормальным - например, поведение спецификации заключается в том, что во многих случаях синтаксические ошибки вызываются во время выполнения, некорректное использование continue, break, ++, -, const, и т. д. в соответствии со спецификацией любой движок, который выдает исключение до достижения этого кодаwrong

Я следуюрешение, данноеslebetman (прочитайте его для всех деталей), но отрегулировано, так как ваш объект не является вложенным.

// First create the array of keys/values so that we can sort it:
var sort_array = [];
for (var key in list) {
    sort_array.push({key:key,value:list[key]});
}

// Now sort it:
sort_array.sort(function(x,y){return x.value - y.value});

// Now process that object with it:
for (var i=0;i<sort_array.length;i++) {
    var item = list[sort_array[i].key];

    // now do stuff with each item
}

С помощьюзапрос-JS Вы можете сделать это так

list.keys().select(function(k){
    return {
        key: k,
        value : list[k]
    }
}).orderBy(function(e){ return e.value;});

Вы можете найти вводную статью о query-jsВот

Underscore.js или Lodash.js для расширенных массивов или сортировки объектов

 var data={
        "models": {

            "LTI": [
                "TX"
            ],
            "Carado": [
                "A",
                "T",
                "A(пасс)",
                "A(груз)",
                "T(пасс)",
                "T(груз)",
                "A",
                "T"
            ],
            "SPARK": [
                "SP110C 2",
                "sp150r 18"
            ],
            "Autobianchi": [
                "A112"
            ]
        }
    };

    var arr=[],
        obj={};
    for(var i in data.models){
      arr.push([i, _.sortBy(data.models[i],function (el){return el;})]);
    }
    arr=_.sortBy(arr,function (el){
      return el[0];
    });
    _.map(arr,function (el){return obj[el[0]]=el[1];});
     console.log(obj);

демонстрация

a = { b: 1, p: 8, c: 2, g: 1 }
Object.keys(a)
  .sort((c,b) => {
    return a[b]-a[c]
  })
  .reduce((acc, cur) => {
    let o = {}
    o[cur] = a[cur]
    acc.push(o)
    return acc
   } , [])

output = [{p: 8}, {c: 2}, {b: 1}, {g: 1}]

ECMAScript 2017 представляетObject.values / Object.entries, Как следует из названия, первый объединяет все значения объекта в массив, а второй превращает весь объект в массив[key, value] массивы; Эквивалент Pythondict.values() а такжеdict.items().

Эти функции значительно упрощают сортировку любого хэша в упорядоченный объект. На данный момент,только небольшая часть платформ JavaScript поддерживает их, но вы можете попробовать это на Firefox 47+.

let obj = {"you": 100, "me": 75, "foo": 116, "bar": 15};

let entries = Object.entries(obj);
// [["you",100],["me",75],["foo",116],["bar",15]]

let sorted = entries.sort((a, b) => a[1] - b[1]);
// [["bar",15],["me",75],["you",100],["foo",116]]
 21 апр. 2018 г., 01:04
FWIW, этот ответ чистый и единственный, который помог мне.
 03 апр. 2018 г., 20:18
@vsync Этот ответ дает тот же результат, что и принятый ответ, но с меньшим количеством кода и без временной переменной.
 14 июн. 2017 г., 17:15
как это, возможно, отвечает на заголовок вопросаSorting JavaScript Object by property value ? Я думаю, вы неправильно поняли вопрос, поскольку вам нужно изменить исходный объект, а не создавать из него новый массив.

many similar and useful functions: https://github.com/shimondoodkin/groupbyfunctions/

function sortobj(obj)
{
    var keys=Object.keys(obj);
    var kva= keys.map(function(k,i)
    {
        return [k,obj[k]];
    });
    kva.sort(function(a,b){
        if(a[1]>b[1]) return -1;if(a[1]<b[1]) return 1;
        return 0
    });
    var o={}
    kva.forEach(function(a){ o[a[0]]=a[1]})
    return o;
}

function sortobjkey(obj,key)
{
    var keys=Object.keys(obj);
    var kva= keys.map(function(k,i)
    {
        return [k,obj[k]];
    });
    kva.sort(function(a,b){
        k=key;      if(a[1][k]>b[1][k]) return -1;if(a[1][k]<b[1][k]) return 1;
        return 0
    });
    var o={}
    kva.forEach(function(a){ o[a[0]]=a[1]})
    return o;
}

Обновление с ES6: Если у вас возникли проблемы с сортировкой объекта для итерации (поэтому я полагаю, что вы хотите отсортировать свойства объекта), вы можете использоватькарта объект.

Вы можете вставить свои пары (ключ, значение) в отсортированном порядке, а затем сделатьfor..of цикл будетguarantee иметь их цикл в том порядке, в котором вы их вставили

var myMap = new Map();
myMap.set(0, "zero");
myMap.set(1, "one");
for (var [key, value] of myMap) {
  console.log(key + " = " + value);
}
// 0 = zero 
// 1 = one
 06 февр. 2017 г., 16:21
Но где же `sort & apos; операция? Они вообще не сортируются
 31 дек. 2016 г., 17:26
Также в ES6 (ES2015): Свойства объектаdo иметь порядок (или есть средства доступа к ним в определенном порядке, в зависимости от вашей точки зрения). Если имена свойств являются строками и не похожи на индексы массива, порядок - это порядок, в котором они были добавлены к объекту. Этот заказnot указано быть уважаемымfor-in или жеObject.keys, но этоis определяется для уваженияObject.getOwnPropertyNames и другие новые методы для доступа к массивам имен свойств. Так что это еще один вариант.
 07 февр. 2017 г., 17:08
@ Зеленый я думаю, что я хотел бы подчеркнуть, чтоMap на самом деле у вас есть структура данных, которая может храниться в отсортированном порядке (сортировать данные, проходить по ним и сохранять их на карте), поскольку вы не гарантируете этого с объектами.

Еще один способ решить эту проблему:

var res = [{"s1":5},{"s2":3},{"s3":8}].sort(function(obj1,obj2){ 
 var prop1;
 var prop2;
 for(prop in obj1) {
  prop1=prop;
 }
 for(prop in obj2) {
  prop2=prop;
 }
 //the above two for loops will iterate only once because we use it to find the key
 return obj1[prop1]-obj2[prop2];
});

//res будет иметь массив результатов

Ваш ответ на вопрос