【问题标题】:How to transform object into sorted array by Lodash如何通过 Lodash 将对象转换为排序数组
【发布时间】:2018-01-29 20:29:15
【问题描述】:

如何通过lodash将{2:'b',3:'c',1:'a'}转换成[{1:'a'},{2:'b'},{3:'c'}]

【问题讨论】:

    标签: javascript arrays sorting object lodash


    【解决方案1】:

    使用即将推出的带有 Object.entries 的 Javascript,您可以使用单个对象映射一个新数组。

    var data = {2:'b',3:'c',1:'a'},
        result = Object
            .entries(data)
            .sort((a, b) => a[0] - b[0])
            .map(([k, v]) => ({ [k]: v }));
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    使用 lodash,您可以使用

    var data = {2:'b',3:'c',1:'a'},
        result = _
            .chain(data)
            .toPairs(data)
            .sortBy([0])
            .map(o => _.fromPairs([o]));
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

    【讨论】:

      【解决方案2】:

      使用Object.keys + Array.map 相当简单,你真的不需要lodash:

      const obj = {2:'b',3:'c',1:'a'};
      const arr = Object.keys(obj).map(key => ({ [key]: obj[key] }))
      
      console.log(arr)

      关于缺少sort 函数,上面的代码利用了数字索引的对象键(根据规范)顺序存储的事实。自己检查订单:

      console.log({2:'b',3:'c',1:'a'})

      这是the spec的相关部分

      9.1.12 [[OwnPropertyKeys]] ( )

      当调用 O 的 [[OwnPropertyKeys]] 内部方法时 采取以下步骤:

      1. 让键是一个新的空列表。

      2. 对于每个自己 O 的属性键 P 是一个整数索引,按升序排列 索引顺序

        2a。添加 P 作为键的最后一个元素。

      【讨论】:

      • 我知道对象键不假定是排序的 (stackoverflow.com/questions/29623333/…),但我不知道 Object.keys 通常是排序的。在哪里可以找到有关此的更多信息??
      • 用规范和相关部分@kevlai22 的链接更新了我的答案。请注意,这仅适用于数字索引
      • 没问题@kevlai22,很高兴能帮上忙! :)
      【解决方案3】:

      Lodash 并不是真正需要完成你想要的,但我仍然在添加它并添加一个排序函数。我还包含了原生 JavaScript 方式。

      const obj = {b: 3, c: 2, a: 1};
      
      
      const sortByKeys = object => {
        const keys = Object.keys(object)
        const sortedKeys = _.sortBy(keys)
      
        return _.map(sortedKeys, key => ({ [key]: object[key]}))
      }
      
      // the lodash way, and sorted
      console.log(sortByKeys(obj))
      
      // simpler way
      const result = Object.keys(obj)
        .map(key => ({ [key]: obj[key] }))
        
       console.log(result)
      <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>

      【讨论】:

        【解决方案4】:

        为什么要使用 lodash?只需使用常规 Javascript。解决方案可以稍微清理一下,但想法是遍历您的对象并将您想要的格式推送到一个新数组中。为了方便起见,我也将排序放在那里,但请随意根据自己的喜好重新考虑。

        const obj = {2:'b',3:'c',1:'a'}
        
        let newArr = [];
        for (var key in obj) {
          newArr.push({[key]: obj[key]})
          newArr.sort((a, b) => a[key] > b[key])
        }
        console.log(newArr)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-12-21
          • 2015-07-25
          • 2015-10-12
          • 2016-08-06
          • 1970-01-01
          • 1970-01-01
          • 2019-01-26
          相关资源
          最近更新 更多