我有一个像这样的对象字典:
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>
&#13;
不幸的是,它只是以与以前相同的顺序返回对象。感谢您提前提供任何帮助!
答案 0 :(得分:2)
对象本质上是无序的。你正在排序一个数组(它可以工作),但是你转换回一个对象(键/值对),所以结果会失去它的排序。
如果您在keyBy
和mapValues
之前停留,您会看到确实有排序结果:
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>