다음과 같은 JavaScript 객체가있는 경우 :
var list = {
"you": 100,
"me": 75,
"foo": 116,
"bar": 15
};
값을 기준으로 속성을 정렬하는 방법이 있습니까? 그래서 나는 결국
list = {
"bar": 15,
"me": 75,
"you": 100,
"foo": 116
};
답변
그것들을 배열로 옮기고 그 배열을 정렬 한 다음 그 배열을 목적에 맞게 사용하십시오. 해결책은 다음과 같습니다.
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]
})
답변
전체 데이터 구조를 복제하거나 연관 배열이 필요한 배열을 사용하고 싶지 않습니다.
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
답변
객체는 많은 양의 속성을 가질 수 있으며 객체를 배열에 넣을 경우 원하는 객체 속성, 숫자 또는 문자열을 기준으로 정렬하도록 선택할 수 있습니다. 이 배열을 고려하십시오.
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);
답변
완전성을 위해이 함수는 정렬 된 객체 속성 배열 을 반환 합니다.
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 () 변환을 모두 제거 할 수 있습니다.
답변
ECMAScript 2017에서 소개 Object.values / Object.entries
합니다. 이름에서 알 수 있듯이 전자는 객체의 모든 값을 배열로 집계하고 후자는 전체 객체를 배열 배열로 집계 [key, value]
합니다. 파이썬의 동등 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]]
답변
@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
}), {})
답변
JavaScript 객체는 정의에 따라 순서가 다릅니다 ( ECMAScript 언어 사양 , 섹션 8.6 참조). 언어 사양은 객체의 속성을 두 번 연속 반복 할 경우 동일한 순서로 두 번째로 나올 것이라고 보장하지도 않습니다.
주문해야 할 것이 있으면 배열과 Array.prototype.sort 메소드를 사용하십시오.