通过lodash

时间:2017-05-24 04:59:54

标签: 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>
&#13;
&#13;
&#13;

不幸的是,它只是以与以前相同的顺序返回对象。感谢您提前提供任何帮助!

1 个答案:

答案 0 :(得分: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>