按值对对象属性进行排序
如果我有一个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
更新:2017年4月 -这将返回上面定义的排序的myObj
对象。
Object.keys(myObj).sort((a, b) => myObj[a]-myObj[b]).reduce((_sortedObj, key) => ({..._sortedObj, [key]: myObj[key]}), {})
在这里尝试!
更新:2018年10月 -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 });
按值对对象属性进行排序相关推荐
- JavaScript 数组排序,随机排序,查找最大(最小)值,对象属性进行排序
JavaScript 数组排序 1.数组排序- - -sort() 根据首字符进行排序,a-z.注意:会改变原数组 var array=["c","d",&qu ...
- 按属性值对对象数组进行排序
我使用AJAX获得了以下对象并将它们存储在数组中: var homes = [{"h_id": "3","city": "Dall ...
- 按字符串属性值对对象数组进行排序
问: 我有一组 JavaScript 对象: var objs = [ { first_nom: 'Lazslo', last_nom: 'Jamf' },{ first_nom: 'Pig', la ...
- java集合对象排序_java ArrayList集合中的某个对象属性进行排序的实现代码
开发中有时候需要自己封装分页排序时,List如何对某一属性排序呢,分享一个小实例,大家共勉,希望能对大家有用,请多多指教. 1.Student的Bean如下: public class Student ...
- python中关系运算符惰性求值_python对象属性惰性取值
python面向对象进阶 在知乎上面看到这个如何让python对象属性具有惰性求值的能力,认真学习了一番,记录一下. __setattr__.__getattr__.__delattr__ class ...
- 5个元素排序java_Android-java-如何按对象内的某个值对对象列表进行排序
如果您要查找默认排序,则应使用Comparable而不是Comparator. 看到这里,这可能会有帮助- 类何时应该是Comparable和/或Comparator? 尝试这个 - import j ...
- 区分元素特性attribute和对象属性property
定义 元素特性attribute是指HTML元素标签的特性 下面的id.class.title.a都是特性,其中a叫做自定义特性 <div id="id1" class=&q ...
- 对象.属性和对象[‘属性’]的区别
对象.属性和对象['属性']这两个用法的意义其实是一样的,都是用来调用对象的属性. 其中,属性都是字符串类型的,即使是纯数字,也会转化为字符串类型,但是当对象的属性的命名不合法时,就会报错!即使在他上 ...
- js对象、数组对象根据属性值进行升序降序排序
1.js对象排序 // 排序之前 let objs = {f: {id: 2,name: '2'},a: {id: 3,name: '3'},c: {id: 1,name: '1'} }// 根据对象 ...
最新文章
- discuz在线人数的实现原理(Discuz6.1.0)
- shell编程服务器维护,简单监测服务器的shell脚本
- boost::coroutines模块实现斐波那契的测试程序
- html 显示状态条,怎么控制html5 video 控制条显示和隐藏时间
- 【渝粤题库】陕西师范大学200431综合英语(一)作业(高起专、高起本)
- Python 小白从零开始 PyQt5 项目实战(4)基本控件
- 绑定数据源注意的地方
- nyoj 144小珂的苦恼(关于如何不定方程有整数解问题)
- java.lang.stringind_为什么越界了? java.lang.StringIndexOutOfBoundsException
- 线性代数学习笔记——第三十五讲——平面与平面的位置关系
- 使用nodejs pkg创建exe文件后更改图标
- 工程制图计算机绘图实训总结感悟,工程制图心得体会.doc
- 如何做一份漂亮的年终总结报告?教你5个实用套路
- 如何将flv格式的视频转换为mp4格式
- ConcurrentHashMap的锁
- SystemUI原生信号塔替换为五格信号塔
- 首届·技术播客月开播在即
- 花卡宝藏版2020版
- 公众号文章怎么制作?
- cpu性能测试软件 国际象棋,CPU性能评测软件