[javascript] 값을 기준으로 객체 속성 정렬

다음과 같은 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);

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


답변

완전성을 위해이 함수는 정렬 된 객체 속성 배열 을 반환 합니다.

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 메소드를 사용하십시오.