Lodash分选&按值排序深度对象,而不会丢失密钥

时间:2017-03-21 06:05:09

标签: javascript object lodash

我对this主题的上一篇文章有​​类似的需求:需要在不丢失密钥的情况下对对象进行排序和排序。但是,我有一个对象的对象:

var o = { 
  123: { field: "science", name: "zed" },
  234: { field: "tech", name: "sara" },
  672: { field: "arts", name: "jon" }
}

_.fromPairs(_.sortBy(_.toPairs(o),function(a){ return a[1] }).reverse()) 

上面使用了lodash解决方案提到的另一个主题 - 但是我没有得到任何结果的一致性(保留密钥!)

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

我不清楚你打算在上面对什么价值进行排序,因为对象是无法比拟的。假设您希望按名称字段对它们进行排序 - 但您会发现它仍无效。

首先是一些背景:

历史上,对象属性在ES中被认为是无序的。密钥的枚举顺序(例如for ... inObject.keys())是特定于实现的。

但是,枚举顺序成为ES2015中的指定行为。

该枚举顺序编纂了大多数引擎已经在做的事情:

  1. 首先枚举整数的键,从最低到最高。
  2. 字符串键按赋值顺序枚举。
  3. 符号键按赋值顺序枚举。
  4. 如果需要将整数用作有序键,则需要使用不同的数据结构。 Map是恰当的:

        const o = { 
          123: { field: "science", name: "zed" },
          234: { field: "tech", name: "sara" },
          672: { field: "arts", name: "jon" }
        }
    
        const { compare } = new Intl.Collator();
    
        const res = new Map(Object
          .entries(o)
          .sort(([ , a ], [ , b ]) => compare(a.name, b.name))
        );
    
        console.log([ ...res ]);

    如果您需要担心旧的IE,一组键值条目也足够了。