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


697

다음과 같은 JavaScript 객체가있는 경우 :

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

값을 기준으로 속성을 정렬하는 방법이 있습니까? 그래서 나는 결국

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

4
"정렬"뿐만 아니라 숫자를 정렬하는 것이 더 중요합니다. 숫자는 Javascripts Array.sort () 메서드에 영향을받지 않으므로 속성 정렬 방법을 찾아야 할뿐만 아니라 숫자 값을 비교하기 위해 고유 한 함수를 작성해야합니다.
Sampson

107
답변을 읽기 전에 : 답변은 아니요 입니다. ECMAScript에서는 객체 속성의 순서가 비표준입니다. JavaScript 객체의 요소 순서에 대해 가정해서는 안됩니다. 객체는 정렬되지 않은 속성 모음입니다. 아래의 답변은 배열을 사용하여 정렬 된 속성을 "사용"하는 방법을 보여 주지만 실제로는 객체 자체의 속성 순서를 변경하지 않습니다. 따라서 불가능합니다. 미리 정렬 된 속성으로 객체를 빌드하더라도 나중에 동일한 순서로 표시되는 것은 아닙니다. 읽어 :).
빈드 라이

3
@GovindRai는 아직 실제 프론트 엔드 애플리케이션에서 ID를 키로 사용하여 객체 컬렉션을 반복하며 HTML 템플릿으로 변환 할 경우 순서가 중요합니다. 당신은 그들이 순서가 없다고 말하고, 나는 그들이 현재 브라우저에서 console.logging 할 때 내가 보는 순서를 가지고 있다고 말합니다. 그리고 그 순서는 재정렬 될 수 있습니다. 당신이 그들을 반복하자마자, 그들은 순서가 있습니다.
ProblemsOfSumit

7
@GovindRai : 이제 스펙에서 지정된 순서로 속성에 액세스하는 방법이 있습니다. 좋은 생각입니까? 거의 확실하지 않습니다. :-) 그러나 ES2015 기준입니다.
TJ Crowder

7
2019 방문자 :이 거의 upvoted 확인 Object.entries: 깨끗한 대부분 읽을 수 ES2017 이후 예술의 상태 기반 대답 stackoverflow.com/a/37607084/245966
jakub.g

답변:


706

그것들을 배열로 옮기고 그 배열을 정렬 한 다음 그 배열을 목적에 맞게 사용하십시오. 해결책은 다음과 같습니다.

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

24
"키를 정렬하고 객체에서 값을 가져 오기 위해 배열을 사용할 수 있습니다"로 "재 구축 가능"을 재구성 할 수 있습니까? 자신이 언급했듯이 비표준 일뿐 만 아니라이 잘못된 가정은 오늘날 Chrome뿐만 아니라 더 많은 브라우저에 의해 깨지기 때문에 사용자가 시도하지 않는 것이 좋습니다.
Oleg V. Volkov

32
다음은보다 간단한 코드 버전입니다. Object.keys (maxSpeed) .sort (function (a, b) {return-(maxSpeed ​​[a]-maxSpeed ​​[b])});
TheBrain

6
@TheBrain : 추가하기 만하면 keys()IE9 + (및 다른 최신 브라우저)에서만 지원됩니다. 또한 keys()요소 프로토 타입 체인 (예 : for..in)에서 열거 가능한 속성을 제외하지만 일반적으로 더 바람직합니다.
MrWhite

31
_.pairs객체를 [[key1, value1], [key2, value2]]로 바꿉니다. 그런 다음 sort를 호출하십시오. 그런 다음 _.object다시 켜십시오.
Funkodebat

2
내 프로젝트에는 깔끔하게 병합하기 위해 객체 키가 필요하지만 메타 데이터가 UI를 구동 할 때 명시적인 정렬이 필요합니다. 프로토 타입 체인이 크롤링되는 것을 피하기 위해 hasOwnProperty 검사를 추가 한 비슷한 접근 방식 만 따랐습니다. 다음은 JS hackernoon.com/의
Nathan Agersea

416

전체 데이터 구조를 복제하거나 연관 배열이 필요한 배열을 사용하고 싶지 않습니다.

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


22
이것은 가치가 아닌 키를 기준으로 정렬하는 것 같습니다.
Michael

27
값별로 정렬되어 키를 표시하지만 키만 인쇄하기 때문에 인쇄 할 때 값 카운트를 잃습니다.
Hanna

6
JavaScript에서는 객체 속성 순서가 보장되지 않으므로 정렬은 객체가 아닌 배열 ( '연관 배열'이라고 함)로 정렬해야합니다.
Christopher Meyers

6
잊지 마세요. keysSorted배열입니다! 대상이 아닙니다!
Green

17
.map(key => list[key]);정렬의 끝에 추가 하면 키 대신 전체 객체를 반환합니다
James Moran

184

객체는 많은 양의 속성을 가질 수 있으며 객체를 배열에 넣을 경우 원하는 객체 속성, 숫자 또는 문자열을 기준으로 정렬하도록 선택할 수 있습니다. 이 배열을 고려하십시오.

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/


1
이름별로 정렬 substr하면 첫 번째 문자가 나오지 않아야 합니다. 다른 사람 Diana과는 Debra정의되지 않은 순서를 가지고있다. 또한 byDate정렬은 실제로가 num아닌을 사용합니다 born.
Lawrence Dol

이것은 좋아 보이지만 문자열을 비교하기 위해 사용할 수 있습니다.x.localeCompare(y)
Jemar Jones

2
@JemarJones localCompare는 매우 유용한 기능처럼 보입니다! IE 10 이하, Safari Mobile 9 이하 등 모든 브라우저에서 지원되지는 않습니다.
inorganik

@inorganik 그렇습니다 브라우저를 지원해야하는 사람들을위한 아주 좋은 메모
Jemar Jones

1
이것은 요구 된 OP (여러 속성을 가진 개체)가 아닌 개체의 배열입니다.
João Pimentel Ferreira

62

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

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 () 변환을 모두 제거 할 수 있습니다.


1
객체 배열은 어떻습니까? [{name : Will}, {name : Bill}, {name : Ben}]
윌 핸콕

1
안녕하십니까, 이 비교에 localeCompare 기능 을 사용할 수 있습니다 . 위의 답변에 추가했습니다.
Stano

훌륭한 솔루션. 문자열 정렬은 반환이 필요합니다
pfwd

@Stano 정확하고 간단한 솔루션. 정말 고마워.
Abrar Hossain '

48

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]]

질문 제목에 Sorting JavaScript Object by property value어떻게 대답 할 수 있습니까? 원본 객체를 변경하고 새 배열을 만들지 않기 때문에 내가 생각하는 질문을 오해했습니다.
vsync

2
@vsync이 답변은 허용되는 답변과 동일한 결과를 제공하지만 코드는 적고 임시 변수는 없습니다.
대런 쿡

3
FWIW,이 답변은 깨끗하고 나를 도운 유일한 방법입니다.
NetOperator Wibby

더 이상 크롬이 아닌 ff에서만 객체를 자동으로 정렬합니다. wtf
fb

이것은 키를 보존하지 않습니다.
Vael Victus

40

@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
 }), {})

여기 사용해보십시오!


1
작동하지 않음var myObj = {"1": {"Value": 40}, "2": {"Value": 10}, "3": {"Value": 30}, "4": {"Value": 20}};
Rohanil

5
OP의 질문 과이 답변에는 중첩 된 객체가 포함되어 있지 않습니다. @Rohanil 다운 투표 대신 다른 질문을하고 싶을 수도 있습니다.
Jason J. Nathan

참고 사항 : 업데이트가 실제로 작동하지 않습니다. 적어도 어디서나 아니고 때문에 entries. 표준에 따르면 객체 는 정렬되지 않은 속성 모음입니다 . 즉, 속성 값이나 다른 방법으로 정렬 한 후 새 객체를 만들려고하면 속성 키 순서가 다시 정의되지 않습니다. 예를 들어 Chrome은 기본적으로 속성 키를 주문하므로 다르게 주문하려는 모든 시도는 쓸모가 없습니다. 당신의 유일한 기회는 주문 환경 설정에 따라 "인덱스"를 얻고 그에 따라 원본 객체를 순회하는 것입니다.
조르고

예 @ 조르고 즈, 당신 말이 맞고 많은 사람들 이이 게시물에 그것을 언급했습니다. 대부분의 경우이 함수를 다른 유형 (JSON과 같은)으로 변환하기 전에 또는 다른 reduce 함수 전에 변환으로 사용합니다. 이후에 객체를 변경하는 것이 목적이라면 예기치 않은 결과가 발생할 수 있습니다. 엔진 전체에서이 기능으로 성공했습니다.
Jason J. Nathan

참고 : 당신이 사용하지 않을 sort()Object.entries()
Solvitieg

36

JavaScript 객체는 정의에 따라 순서가 다릅니다 ( ECMAScript 언어 사양 , 섹션 8.6 참조). 언어 사양은 객체의 속성을 두 번 연속 반복 할 경우 동일한 순서로 두 번째로 나올 것이라고 보장하지도 않습니다.

주문해야 할 것이 있으면 배열과 Array.prototype.sort 메소드를 사용하십시오.


4
이것에 대해 꽤 많은 논쟁이있었습니다. 대부분의 구현은 요소가 추가 된 순서대로 목록을 유지합니다. IIRC, Chrome은 그렇지 않습니다. Chrome이 다른 구현과 일치해야하는지에 대한 논쟁이있었습니다. 내 생각에 JavaScript 객체는 해시이므로 순서를 가정해서는 안됩니다. 나는 파이썬이 같은 주장을 겪었고 최근에 새로운 주문 해시와 같은 목록이 도입되었다고 생각합니다. 대부분의 브라우저에서는 정렬 된 값으로 요소를 추가하여 객체를 재생성하여 원하는 작업을 수행 할 수 있습니다. 그러나 당신은해서는 안됩니다.
Nosredna

편집하다. Chrome은 일반적으로 주문을 유지하지만 항상 그런 것은 아닙니다. 관련 Chromium 버그는 다음과 같습니다. code.google.com/p/chromium/issues/detail?id=883
Nosredna

6
그 버그 보고서는 정당하지 않으며, 문서화되지 않은 행동에 의존 한 사람들이 버그를 가진 사람들입니다. ECMASCript 섹션 8.6을 읽으십시오. "객체는 정렬되지 않은 속성 모음"이라고 명시되어 있습니다. 몇 가지 구현에서 그렇게 보이지 않는 것을 발견하고 구현 특정 행동에 의존하기 시작한 사람은 큰 실수를 저질렀으며 그 책임을 자신에게서 멀어지게하려고해서는 안됩니다. Chrome 팀에있는 경우 해당 버그 보고서를 "Invalid, WontFix"로 표시했습니다.
NickFitz

8
EcmaScript 5는 실제로 열거 순서를 삽입 순서로 정의합니다. 정의가 없으면 ES3에서 스펙 버그로 간주됩니다. EcmaScript 사양은 아무도 제정신이 아닌 것으로 간주되는 동작을 정의한다는 점에 주목할 필요가 있습니다. 사양 그 코드에 도달하기 전에 예외를 throw 어떤 엔진입니다 잘못된
olliej

4
@ olliej-이것이 옳지 않다고 생각합니다. 스펙은 "속성을 열거하는 메커니즘과 순서 (첫 번째 알고리즘의 단계 6.a, 두 번째의 단계 7.a)는 지정되어 있지 않습니다"라고 말합니다. 이것은 최종 초안 PDF의 92 페이지에 있습니다.
whitneyland 2012

25

OK , 당신은 자바 스크립트가있다 알 수 있습니다 ) (종류 정렬 배열로 기능하지만, 객체에 대한 아무것도 ...

이 경우 어쨌든 키 배열을 가져 와서 정렬해야합니다. 왜냐하면 배열이 객체 리터럴보다 더 많은 기본 기능을 가지고 있기 때문에 api가 배열에 객체를 가장 많이주는 이유는 빠른 솔로는 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}

또한이 방법으로 주 객체는 건드리지 않으며 실제로 새로운 객체를 얻습니다.

또한 아래 이미지를 생성하여 기능 단계를보다 명확하게하기 위해 약간의 변경이 필요한 경우를 대비하여 작성하십시오.

속성 값별로 자바 스크립트 객체 정렬


4
이것은 값이 아닌 키를 기준으로 정렬됩니다.
ROROROOROROR

@ROROROOROROR, 그것은 그것이 다르지 않기 때문에 그것이 어떻게 작동 하는지를 나타내는 것일뿐입니다. 그러나 모든 것이 좋습니다. 나도 값을 기준으로 정렬을 추가 할 것입니다
Alireza

1
값을 기준으로 정렬하는 것이 잘못되었으며 데이터 세트입니다. 로 변경 c: 3하면 c: 13분리되는 것을 볼 수 있습니다.
VtoCorleone

1
@VtoCorleone 이것은 자연적인 정렬 오류 일 뿐이며, 제시된대로 알고리즘의 결함이 아닌 1이 우선합니다.
Michael Ryan Soileau

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

간단하고 완벽합니다! 이것은 질문에 대한 답변입니다. 감사.
Ajay Singh

자바 스크립트에서는 키 순서가 보장되지 않으므로 키가 정수 등이면 이것이 실패합니다.
ParoX

정확합니다. ParoX. 키가 정수 유형 인 경우 올바르게 작동하지 않습니다.
jungwon jin

8

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

또한에서 ES6 (ES2015) : 개체 속성 않는 순서가 (또는, 정의 된 순서로 접근 당신의 관점에 따라하는 수단이있다). 속성 이름이 문자열이고 배열 인덱스처럼 보이지 않으면 순서는 개체에 추가 된 순서입니다. 이 순서는되어 있지 존경하는 지정 for-in하거나 Object.keys,하지만이 되어 존경하는 정의 된 Object.getOwnPropertyNames속성 이름 배열에 액세스하기위한 다른 새로운 방법. 이것이 또 다른 옵션입니다.
TJ Crowder

그러나 '정렬'작업은 어디에 있습니까? 그들은 전혀 분류되지 않습니다
Green

@ Green 여기에서 강조하고 Map싶은 것은 실제로 정렬되지 않은 순서로 저장할 수있는 데이터 구조 (데이터 정렬, 반복 및 맵에 저장할 수 있음)를 가지고 있다는 것입니다. 사물.
julianljk

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

데모


6

매우 짧고 간단합니다!

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

5

나는 다음과 같은 오전 에 의해 주어진 솔루션 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
}

4

여러 for-loop가없는 값 정렬 (키로 정렬하여 정렬 콜백에서 색인을 "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) 


2

이것은 실제 순서의 객체로 처리하는 간단한 방법 일 수 있습니다. 얼마나 느린 지 잘 모르겠습니다. 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)

2
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}]


2

누군가가 @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}

2
당신은 점에서 과제를 반환하는 map, forEach더 나은 것
DiegoRBaquero

2
let toSort = {a:2323, b: 14, c: 799} 
let sorted = Object.entries(toSort ).sort((a,b)=> a[1]-b[1]) 

산출:

[ [ "b", 14 ], [ "c", 799 ], [ "a", 2323 ] ]

1

많은 유사하고 유용한 기능 : 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;
}

1

값으로 정렬 된 객체 (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;
}

1

여기 또 다른 예가 있습니다 :

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


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

1

TypeScript

다음 함수는 값 또는 값의 속성을 기준으로 객체를 정렬합니다. 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

입력은 객체, 출력은 객체, lodash & js 내장 lib를 사용하고 내림차순 또는 오름차순 옵션을 사용하며 입력 객체를 변경하지 않습니다.

예 : 입력 및 출력

{
  "a": 1,
  "b": 4,
  "c": 0,
  "d": 2
}
{
  "b": 4,
  "d": 2,
  "a": 1,
  "c": 0
}

구현

const _ = require('lodash');

const o = { a: 1, b: 4, c: 0, d: 2 };


function sortByValue(object, descending = true) {
  const { max, min } = Math;
  const selector = descending ? max : min;

  const objects = [];
  const cloned = _.clone(object);

  while (!_.isEmpty(cloned)) {
    const selectedValue = selector(...Object.values(cloned));
    const [key, value] = Object.entries(cloned).find(([, value]) => value === selectedValue);

    objects.push({ [key]: value });
    delete cloned[key];
  }

  return _.merge(...objects);
}

const o2 = sortByValue(o);
console.log(JSON.stringify(o2, null, 2));

1
const arrayOfObjects = [
{name: 'test'},
{name: 'test2'}
]

const order = ['test2', 'test']

const setOrder = (arrayOfObjects, order) =>
    arrayOfObjects.sort((a, b) => {
        if (order.findIndex((i) => i === a.name) < order.findIndex((i) => i === b.name)) {
            return -1;
        }

        if (order.findIndex((i) => i === a.name) > order.findIndex((i) => i === b.name)) {
            return 1;
        }

        return 0;
    });

1

정렬 내 솔루션 :

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

let sorted = Object.entries(list).sort((a,b) => a[1] - b[1]);

for(let element of sorted) {
    console.log(element[0]+ ": " + element[1]);
}

코드를 코드로 포맷하십시오
Itamar Mushkin

1
<pre>
function sortObjectByVal(obj){  
var keysSorted = Object.keys(obj).sort(function(a,b){return obj[b]-obj[a]});
var newObj = {};
for(var x of keysSorted){
    newObj[x] = obj[x];
}
return newObj;

}
var list = {"you": 100, "me": 75, "foo": 116, "bar": 15};
console.log(sortObjectByVal(list));
</pre>

1
stackoverflow에 오신 것을 환영합니다. 제공하신 답변 외에도 문제가 해결되는 이유와 방법에 대한 간단한 설명을 제공하십시오.
jtate

0

이것을 해결하는 또 다른 방법 :-

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 는 결과 배열을 가질 것이다


0

감사하고 계속 @Nosredna 답변

이제 객체를 배열로 변환 한 다음 배열을 정렬해야한다는 것을 이해했습니다. 이것은 배열 (또는 변환 된 객체를 배열로)을 문자열로 정렬하는 데 유용합니다.

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

0

이 시도. 개체에 정렬하려는 속성이 없으면 처리됩니다.

객체와 함께 속성을 보내서 호출하십시오.

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;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.