如果我有一个JavaScript对象,例如:

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

有没有一种方法可以基于值对属性进行排序? 这样我最终

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

#1楼

根据定义,JavaScript对象是无序的(请参阅ECMAScript语言规范 8.6节)。 语言规范甚至不能保证,如果您连续两次遍历对象的属性,那么第二次它们将以相同的顺序出现。

如果需要订购商品,请使用数组和Array.prototype.sort方法。


#2楼

将它们移动到一个数组,对该数组进行排序,然后将其用于您的目的。 这是一个解决方案:

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对象中元素的顺序。

var objSorted = {}
sortable.forEach(function(item){objSorted[item[0]]=item[1]
})

#3楼

为了完整起见,此函数返回对象属性的排序数组

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 stringsreturn 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()转换,以进行区分大小写的字符串比较。


#4楼

我正在遵循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
}

#5楼

我们不想复制整个数据结构,也不想在需要关联数组的地方使用数组。

这是与bonna相同的另一种方式:

 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 

#6楼

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);

演示


#7楼

您的对象可以具有任意数量的属性,如果将对象放入数组中,则可以选择按所需的对象属性,数字或字符串进行排序。 考虑以下数组:

var arrayOfObjects = [   {name: 'Diana',born: 1373925600000, // Mon, Jul 15 2013num: 4,sex: 'female'},{name: 'Beyonce',born: 1366832953000, // Wed, Apr 24 2013num: 2,sex: 'female'},{            name: 'Albert',born: 1370288700000, // Mon, Jun 3 2013num: 3,sex: 'male'},    {name: 'Doris',born: 1354412087000, // Sat, Dec 1 2012num: 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/


#8楼

解决此问题的另一种方法:

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 keyreturn obj1[prop1]-obj2[prop2];
});

// res将有结果数组


#9楼

谢谢并继续回答@Nosredna

现在我们了解了需要将对象转换为数组然后对数组进行排序的知识。 这对于按字符串对数组(或转换为数组的对象)进行排序很有用:

Object {6: Object, 7: Object, 8: Object, 9: Object, 10: Object, 11: Object, 12: Object}6: Objectid: "6"name: "PhD"obe_service_type_id: "2"__proto__: Object7: Objectid: "7"name: "BVC (BPTC)"obe_service_type_id: "2"__proto__: Object//Sort optionsvar 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: Objectid: "11"name: "AS/A2"obe_service_type_id: "2"__proto__: Objectlength: 2__proto__: Array[0]1: Array[2]0: "7"1: Objectid: "7"name: "BVC (BPTC)"obe_service_type_id: "2"__proto__: Objectlength: 2

#10楼

这可能是将其作为真实有序对象处理的简单方法。 不知道它有多慢。 使用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)

#11楼

尝试这个。 即使您的对象不具有要基于其进行排序的属性,也将得到处理。

只需通过发送带有对象的属性来调用它。

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;
}

#12楼

使用query-js可以做到这一点

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

您可以在此处找到有关query-js的介绍性文章


#13楼

我为此专门制作了一个插件,它接受1 arg(未排序的对象),并返回已按prop值排序的对象。 这将适用于所有二维对象,例如{"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));

这是该功能的演示程序,按预期工作 http://codepen.io/nicholasabrams/pen/RWRqve?editors=001


#14楼

许多类似且有用的功能: 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;
}

#15楼

Couln't上面找到这个问题的答案将工作和 ,并支持嵌套的对象(不是数组),所以我写了我自己的一个:)与字符串和整数两部作品。

  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 outvar objSorted = sortObjectProperties(objUnsorted, 'customValue');// now console.log(objSorted) will return:{ prop2 : {customValue : 'AA'},prop1 : {customValue : 'ZZ'} }

#16楼

ECMAScript 2017引入了Object.values / Object.entries 。 顾名思义,前者将对象的所有值聚合到一个数组中,后者将整个对象聚合到一个[key, value]数组中。 Python的当量dict.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]]

#17楼

这是另一个示例:

 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); 

#18楼

@marcusR的答案的“箭头”版本以供参考

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

更新:20174月 -这将返回上面定义的排序的myObj对象。

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

在这里尝试!

更新:201810月 -Object.entries版本

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

在这里尝试!


#19楼

用ES6更新:如果您担心要遍历排序对象(这就是为什么我想您希望对对象属性进行排序的原因),则可以使用Map对象。

您可以按排序的顺序插入(键,值)对,然后进行for..of循环将保证使它们按插入顺序循环

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

#20楼

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]]);}// [["you",100],["me",75],["foo",116],["bar",15]]sortable.sort(function(a, b) {return (a[1] < b[1] ? -1 : (a[1] > b[1] ? 1 : 0));});// [["bar",15],["me",75],["you",100],["foo",116]]var orderedList = {};for (var idx in sortable) {orderedList[sortable[idx][0]] = sortable[idx][1];}return orderedList;
}sortAssocObject(list);// {bar: 15, me: 75, you: 100, foo: 116}

#21楼

这是获取对象排序并返回对象排序的方法

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

您可以根据需要自定义排序功能


#22楼

好的 ,您可能知道,javascript具有sort()函数,可以对数组进行排序,但对象没有任何功能...

因此,在那种情况下,我们需要以某种方式获取键的数组并对其进行排序,这就是api大部分时间为您提供数组对象的原因,因为Array与对象文字相比,与它们相比,它具有更多的本机功能,无论如何,快速的解决方法是使用Object.key返回对象键的数组,我在下面创建了ES6函数来为您完成工作,它使用了JavaScript中的本机sort()reduce()函数:

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}

同样,主对象也不会被触摸,实际上我们得到了一个新对象。

我还创建了下面的图像,以使功能步骤更清晰,以防万一您需要对其进行一些更改以按自己的方式工作:


#23楼

对象按值排序(DESC)

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;
}

#24楼

如果我有这样的对象,

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
}

启动一个单独的Object sortedDayObj,

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

您可以返回sortedDayObj


#25楼

    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 }

#26楼

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} , [])

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


#27楼

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上的链接


#28楼

以防万一,有人使用@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}

#29楼

在没有多个for循环的情况下对值进行排序(按键排序将排序回调中的索引更改为“ 0”)

 const list = { "you": 100, "me": 75, "foo": 116, "bar": 15 }; let sorted = Object.fromEntries( Object.entries(list).sort( (a,b) => a[1] - b[1] ) ) console.log('Sorted object: ', sorted) 

#30楼

非常简短!

var sortedList = {};
Object.keys(list).sort((a,b) => list[a]-list[b]).forEach((key) => {sortedList[key] = list[key]; });

#31楼

打字稿

以下函数按值或值的属性对对象进行排序。 如果您不使用TypeScript,则可以删除类型信息以将其转换为JavaScript。

/*** Represents an associative array of a same type.*/
interface Dictionary<T> {[key: string]: T;
}/*** Sorts an object (dictionary) by value or property of value and returns* the sorted result as a Map object to preserve the sort order.*/
function sort<TValue>(obj: Dictionary<TValue>,valSelector: (val: TValue) => number | string,
) {const sortedEntries = Object.entries(obj).sort((a, b) =>valSelector(a[1]) > valSelector(b[1]) ? 1 :valSelector(a[1]) < valSelector(b[1]) ? -1 : 0);return new Map(sortedEntries);
}

用法

var list = {"one": { height: 100, weight: 15 },"two": { height: 75, weight: 12 },"three": { height: 116, weight: 9 },"four": { height: 15, weight: 10 },
};var sortedMap = sort(list, val => val.height);

不能保证JavaScript对象中键的顺序,因此我将结果排序并返回为Map对象,该对象保留了排序顺序。

如果要将其转换回Object,可以执行以下操作:

var sortedObj = {} as any;
sortedMap.forEach((v,k) => { sortedObj[k] = v });

按值对对象属性进行排序相关推荐

  1. JavaScript 数组排序,随机排序,查找最大(最小)值,对象属性进行排序

    JavaScript 数组排序 1.数组排序- - -sort() 根据首字符进行排序,a-z.注意:会改变原数组 var array=["c","d",&qu ...

  2. 按属性值对对象数组进行排序

    我使用AJAX获得了以下对象并将它们存储在数组中: var homes = [{"h_id": "3","city": "Dall ...

  3. 按字符串属性值对对象数组进行排序

    问: 我有一组 JavaScript 对象: var objs = [ { first_nom: 'Lazslo', last_nom: 'Jamf' },{ first_nom: 'Pig', la ...

  4. java集合对象排序_java ArrayList集合中的某个对象属性进行排序的实现代码

    开发中有时候需要自己封装分页排序时,List如何对某一属性排序呢,分享一个小实例,大家共勉,希望能对大家有用,请多多指教. 1.Student的Bean如下: public class Student ...

  5. python中关系运算符惰性求值_python对象属性惰性取值

    python面向对象进阶 在知乎上面看到这个如何让python对象属性具有惰性求值的能力,认真学习了一番,记录一下. __setattr__.__getattr__.__delattr__ class ...

  6. 5个元素排序java_Android-java-如何按对象内的某个值对对象列表进行排序

    如果您要查找默认排序,则应使用Comparable而不是Comparator. 看到这里,这可能会有帮助- 类何时应该是Comparable和/或Comparator? 尝试这个 - import j ...

  7. 区分元素特性attribute和对象属性property

    定义 元素特性attribute是指HTML元素标签的特性 下面的id.class.title.a都是特性,其中a叫做自定义特性 <div id="id1" class=&q ...

  8. 对象.属性和对象[‘属性’]的区别

    对象.属性和对象['属性']这两个用法的意义其实是一样的,都是用来调用对象的属性. 其中,属性都是字符串类型的,即使是纯数字,也会转化为字符串类型,但是当对象的属性的命名不合法时,就会报错!即使在他上 ...

  9. js对象、数组对象根据属性值进行升序降序排序

    1.js对象排序 // 排序之前 let objs = {f: {id: 2,name: '2'},a: {id: 3,name: '3'},c: {id: 1,name: '1'} }// 根据对象 ...

最新文章

  1. discuz在线人数的实现原理(Discuz6.1.0)
  2. shell编程服务器维护,简单监测服务器的shell脚本
  3. boost::coroutines模块实现斐波那契的测试程序
  4. html 显示状态条,怎么控制html5 video 控制条显示和隐藏时间
  5. 【渝粤题库】陕西师范大学200431综合英语(一)作业(高起专、高起本)
  6. Python 小白从零开始 PyQt5 项目实战(4)基本控件
  7. 绑定数据源注意的地方
  8. nyoj 144小珂的苦恼(关于如何不定方程有整数解问题)
  9. java.lang.stringind_为什么越界了? java.lang.StringIndexOutOfBoundsException
  10. 线性代数学习笔记——第三十五讲——平面与平面的位置关系
  11. 使用nodejs pkg创建exe文件后更改图标
  12. 工程制图计算机绘图实训总结感悟,工程制图心得体会.doc
  13. 如何做一份漂亮的年终总结报告?教你5个实用套路
  14. 如何将flv格式的视频转换为mp4格式
  15. ConcurrentHashMap的锁
  16. SystemUI原生信号塔替换为五格信号塔
  17. 首届·技术播客月开播在即
  18. 花卡宝藏版2020版
  19. 公众号文章怎么制作?
  20. cpu性能测试软件 国际象棋,CPU性能评测软件

热门文章

  1. Nginx安装及配置文件解释
  2. 修改域的NetBIOS名称
  3. I/O重定向的原理和实现
  4. ModelState对象
  5. 【Ionic】---Using Local Notifications In Your Ionic Framework App
  6. 11-4实战上色及修复照片
  7. Java本质论之关于Java栈与堆的思考
  8. 不得不爱开源 Wijmo jQuery 插件集(10)-【Expander】(附页面展示和源码)
  9. .NET Framework 3.5 sp1离线安装方案
  10. Android实现计时与倒计时的几种方法