2017-05-24 8 views
0

에서 개체의 속성 중 하나에 의해 개체의 사전 정렬이 같은 개체의 사전이 다음 속성을 오프셋으로 내가 그들을 정렬 할이 lodash

originalJson = { 
    "0":{ 
    "width":55, 
    "offset":152 
    }, 
    "A":{ 
    "width":66, 
    "offset":0 
    }, 
    "B":{ 
    "width":66, 
    "offset":76 
    } 
}; 

을 결과 객체가되어서 너무 다음과 같이 보입니다 :

sortedJson = { 
    "A":{ 
    "width":66, 
    "offset":0 
    }, 
    "B":{ 
    "width":66, 
    "offset":76 
    }, 
    "0":{ 
    "width":55, 
    "offset":152 
    } 
}; 

"A"와 "B"는 오프셋이 낮기 때문에 "0"앞에옵니다.

저는 이것을 달성하기 위해 lodash에 몇 개의 반복을 연결해야한다고 생각합니다. 저는 여기에있어 어디 :

var originalJson = { 
 
    "0":{ 
 
    "width":55, 
 
    "offset":152 
 
    }, 
 
    "A":{ 
 
    "width":66, 
 
    "offset":0 
 
    }, 
 
    "B":{ 
 
    "width":66, 
 
    "offset":76 
 
    } 
 
}; 
 

 
var sortedJson = _.chain(originalJson) 
 
.map(function (val, key) { 
 
    return { character: key, details: val }; 
 
}) 
 
.sortBy(function(o) { 
 
    return o.details.offset; 
 
}) 
 
.keyBy('character') 
 
.mapValues('details') 
 
.value(); 
 

 
$('#console').append(JSON.stringify(sortedJson,false,2));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script> 
 
<pre id="console"> 
 
</pre>

불행하게도, 그것은 단지 이전과 같은 순서로 개체를 반환합니다. 사전에 도움을 주셔서 감사합니다!

답변

2

개체는 본질적으로 순서가 없습니다. 당신은 배열로 (어떤 방식으로) 정렬하고 있지만, 다시 객체 (키/값 쌍)로 변환하고 있으므로 결과가 정렬되지 않습니다. 당신이 keyBymapValues 전에 중지하면

, 당신이 정렬 된 결과를 가지고 할 것을 볼 수 있습니다 :

var originalJson = { 
 
    "0":{ 
 
    "width":55, 
 
    "offset":152 
 
    }, 
 
    "A":{ 
 
    "width":66, 
 
    "offset":0 
 
    }, 
 
    "B":{ 
 
    "width":66, 
 
    "offset":76 
 
    } 
 
}; 
 

 
var sortedJson = _.chain(originalJson) 
 
.map(function (val, key) { 
 
    return { character: key, details: val }; 
 
}) 
 
.sortBy(function(o) { 
 
    return o.details.offset; 
 
}) 
 
.value(); 
 

 
$('#console').append(JSON.stringify(sortedJson,false,2));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script> 
 
<pre id="console"> 
 
</pre>

+0

감사합니다, 그런데 왜 다음이 작업을 수행합니다 : https : //로 jsfiddle.net/karlovac/dtzjyfLj/3/ – antun

+0

@antun Luck? JavaScript 객체의 키에는 순서가 없으므로 인쇄하거나 JSON으로 변환 할 때 표시되는 순서는 정의되지 않습니다 (사용중인 구현을 작성한 사람까지). – smarx

+0

:) 나는 그것이 운이 좋다고 생각하지 않는다. 그 다른 예제를 확장하여 10 개의 키 (A-J)를 갖게하고 원하는 순서대로 정렬하여 반환합니다 : https://jsfiddle.net/karlovac/dtzjyfLj/5/. 10 글자를 산란시키고 알파벳 순서로 나타나게하는 확률은 무한히 작아야합니다. – antun