new - recorrer array de objetos javascript
Ordenar JavaScript objeto por valor de la propiedad (28)
Actualización con ES6: si su preocupación es tener un objeto ordenado para iterar (por lo que imagino que quiere que se ordenen las propiedades de su objeto), puede usar el objeto Map .
Puede insertar sus pares (clave, valor) en orden ordenado y luego hacer un ciclo for..of
le garantizará tenerlos en el orden en que los insertó
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
Si tengo un objeto JavaScript como:
var list = {
"you": 100,
"me": 75,
"foo": 116,
"bar": 15
};
¿Hay una manera de ordenar las propiedades basadas en el valor? Para que termine con
list = {
"bar": 15,
"me": 75,
"you": 100,
"foo": 116
};
Aquí está la manera de ordenar el objeto y obtener el objeto ordenado a cambio
let sortedObject = {}
sortedObject = Object.keys(yourObject).sort((a, b) => {
return yourObject[a] - yourObject[b]
}).reduce((prev, curr, i) => {
prev[i] = yourObject[curr]
return prev
}, {});
Puede personalizar su función de clasificación según su requisito
Aquí hay un ejemplo más:
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);
Colóquelos en una matriz, ordene esa matriz y luego use esa matriz para sus propósitos. Aquí hay una solución:
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]]
Una vez que tenga la matriz, puede reconstruir el objeto a partir de la matriz en el orden que desee, logrando así exactamente lo que se propuso hacer. Eso funcionaría en todos los navegadores que conozco, pero dependería de una peculiaridad de implementación y podría fallar en cualquier momento. Nunca debe hacer suposiciones sobre el orden de los elementos en un objeto de JavaScript.
ECMAScript 2017 introduce Object.values / Object.entries
. Como sugiere su nombre, el primero agrega todos los valores de un objeto en una matriz, y el último hace todo el objeto en una matriz de matrices [key, value]
; El equivalente de Python de dict.values()
y dict.items()
.
Las características hacen que sea más fácil ordenar cualquier hash en un objeto ordenado. A partir de ahora, solo una pequeña parte de las plataformas JavaScript las admiten , pero puedes probarlas en 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]]
Esta podría ser una forma sencilla de manejarlo como un objeto real ordenado. No estoy seguro de lo lento que es. También podría ser mejor con un bucle 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
}
Y luego encontré esta función de inversión desde: 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;
};
Asi que
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)
Estoy siguiendo la solución dada por slebetman (ve a leerla para todos los detalles), pero ajustada, ya que tu objeto no está anidado.
// 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
}
Gracias y sigue respondiendo @Nosredna
Ahora que entendemos que es necesario convertir el objeto en una matriz, ordene la matriz. esto es útil para ordenar la matriz (u objeto convertido a matriz) por cadena:
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
Hice un complemento solo para esto, acepta 1 arg, que es un objeto sin clasificar, y devuelve un objeto que ha sido ordenado por valor de prop. Esto funcionará en todos los objetos bidimensionales como {"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));
Aquí hay una demostración de la función que funciona como se espera http://codepen.io/nicholasabrams/pen/RWRqve?editors=001
Los objetos de JavaScript no están ordenados por definición (consulte la Especificación del lenguaje ECMAScript , sección 8.6). La especificación del lenguaje ni siquiera garantiza que, si recorres las propiedades de un objeto dos veces seguidas, saldrán en el mismo orden la segunda vez.
Si necesita ordenar cosas, use una matriz y el método Array.prototype.sort.
No queremos duplicar toda la estructura de datos, o usar una matriz donde necesitamos una matriz asociativa.
Aquí hay otra manera de hacer lo mismo que 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
No se pudo encontrar la respuesta anterior que funcionaría y sería PEQUEÑA , y admitiría objetos anidados (no arrays), así que escribí la mía propia :) Funciona tanto con cadenas como con caracteres.
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;
}
Uso:
/* 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''
}
}
Objeto ordenado por valor (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;
}
Otra forma de resolver esto:
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 tendrá la matriz de resultados
Para completar, esta función devuelve una matriz ordenada de propiedades de objeto:
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 con el código de arriba está aquí . Esta solución se basa en este artículo .
El violín actualizado para ordenar cadenas está aquí. Puede eliminar ambas conversiones .toLowerCase () adicionales para la comparación de cadenas sensibles a mayúsculas y minúsculas.
Por si acaso, alguien está buscando mantener el objeto (con claves y valores), usando la referencia del código de @Markus R y @James Moran comentando, solo use:
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}
Prueba esto. Incluso su objeto no es tener la propiedad basada en la que está tratando de ordenar, también se manejará.
Simplemente llámalo enviando propiedad con objeto.
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;
}
Si estoy teniendo un objeto como este,
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"]
}
quiero ordenarlo por orden del día,
deberíamos tener el daySorterMap primero,
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
}
Iniciar un objeto separado ordenadoDayObj,
var sortedDayObj={};
Object.keys(dayObj)
.sort((a,b) => daySorterMap[a] - daySorterMap[b])
.forEach(value=>sortedDayObj[value]= dayObj[value])
Puedes devolver el ordenadoDayObj
Sus objetos pueden tener cualquier cantidad de propiedades y usted puede elegir ordenar por cualquier propiedad de objeto, número o cadena, si coloca los objetos en una matriz. Considera esta matriz:
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''
}
];
ordenar por fecha de nacimiento, el más antiguo primero
// 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);
ordenar por nombre
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);
Una versión "con flecha" de la respuesta de @marcusR para referencia
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
ACTUALIZACIÓN: abril de 2017 - Esto devuelve un objeto myObj
ordenado definido anteriormente.
Object
.keys(myObj)
.sort((a, b) => myObj[a]-myObj[b])
.reduce((_sortedObj, key) => ({
..._sortedObj,
[key]: myObj[key]
}), {})
ACTUALIZACIÓN: Octubre 2018 - Versión Object.entries
Object
.entries(myObj)
.sort()
.reduce((_sortedObj, [k,v]) => ({
..._sortedObj,
[k]: v
}), {})
Underscore.js o Lodash.js para ordenamiento avanzado de matrices u objetos
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);
muchas funciones similares y útiles: 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;
}
De acuerdo , como sabrás, javascript tiene la función sort () para ordenar los arreglos, pero nada para el objeto ...
Entonces, en ese caso, necesitamos obtener de alguna manera la matriz de las claves y ordenarlas, esa es la razón por la que la apis le da objetos en una matriz la mayor parte del tiempo, porque la matriz tiene más funciones nativas para jugar con ellas que el objeto literal, de todos modos, la solución rápida es usar Object.key, que devuelve una matriz de las claves de objeto, creo la función ES6 debajo de la cual se encarga del trabajo, usa las funciones de ordenación () y reducción () nativas en javascript:
function sortObject(obj) {
return Object.keys(obj)
.sort().reduce((a, v) => {
a[v] = obj[v];
return a; }, {});
}
Y ahora puedes usarlo así:
let myObject = {a: 1, c: 3, e: 5, b: 2, d: 4};
let sortedMyObject = sortObject(myObject);
Verifique el ordenadoMyObject y podrá ver el resultado ordenado por claves como esta:
{a: 1, b: 2, c: 3, d: 4, e: 5}
También de esta manera, el objeto principal no se tocará y en realidad obtendremos un nuevo objeto.
También creo la imagen a continuación, para que los pasos de la función sean más claros, en caso de que necesite cambiarlo un poco para que funcione a su manera:
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
} , [])
salida = [{p: 8}, {c: 2}, {b: 1}, {g: 1}]
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);
Link Github Gist
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
};
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}