如何通过Lodash将对象转换为有序数组

时间:2017-08-21 17:23:06

标签: javascript arrays sorting object lodash

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

4 个答案:

答案 0 :(得分:6)

使用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函数,上面的代码利用了数字索引的Object键(按照规范)顺序存储的事实。自己检查订单:

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

以下是the spec

的相关部分
  

9.1.12 [[OwnPropertyKeys]]()

     

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

     
      
  1. 让密钥成为新的空列表。

  2.   
  3. 对于每个人   属性键P的O是一个整数索引,以升序数字表示   索引顺序

         

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

  4.   

答案 1 :(得分:2)

使用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>
&#13;
&#13;
&#13;

答案 2 :(得分:1)

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>

答案 3 :(得分:0)

为什么要用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)