【问题标题】:Lodash sorting & ordering deep object by values, without losing the keyLodash 按值对深层对象进行排序和排序,而不会丢失密钥
【发布时间】:2017-03-21 06:05:09
【问题描述】:

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

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 解决方案 - 但是我没有得到任何一致性的结果(我保留了关键!)

任何帮助将不胜感激。

【问题讨论】:

    标签: javascript object lodash


    【解决方案1】:

    我不清楚您打算根据上面的哪个值进行排序,因为对象是无与伦比的。假设您想按名称字段对它们进行排序,但您会发现它仍然不起作用。

    先介绍一下背景:

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

    然而枚举顺序在 ES2015 中成为了一种指定的行为。

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

    1. 首先枚举整数键,从低到高。
    2. 按分配顺序枚举字符串键。
    3. 符号键按分配顺序枚举。

    如果您需要使用整数作为有序键,则需要不同的数据结构。 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,一组键值条目也足够了。

    【讨论】:

    • 这看起来很棒!我需要根据用户选择的内容来灵活排序。再次,很有魅力,谢谢!
    猜你喜欢
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    相关资源
    最近更新 更多